我读到您可以使用继承来扩展结构。我有一个派生类,我想在其中拥有与其父类相同的结构,但扩展了更多字段。这似乎可行,但是当我从修改结构的 Parent 类调用方法时,它对 Child 结构属性没有影响。在这里,我正在尝试的一个例子:
class Parent
{
public:
struct info
{
int a;
};
info data;
virtual void main(void);
};
void Parent::main()
{
data.a =1;
}
class Child: public Parent
{
public:
struct info2: public info
{
int b;
};
info2 data;
virtual void main(void);
};
void Child::main(void)
{
Parent::main();
data.b = 2;
std::cout << data.a << "\n";
std::cout << data.b << "\n";
}
int main(void)
{
Parent *base;
Child derived;
base = &derived;
base->main();
return 0;
}
这不是打印 1 和 2
,而是打印 0 和 2
。所以基本上就好像来自派生类的属性数据没有被调用 Parent::main
修改。
正确的做法是什么?我完全做错了吗?
最佳答案
你的意思是
void Child::main(void)
{
Parent::main();
data.b = 2;
std::cout << Parent::data.a << "\n";
std::cout << data.b << "\n";
}
在派生类中声明的名称data
隐藏了在基类中声明的名称data
。因此,您需要使用限定名称来访问父类的隐藏成员。
至于派生类的成员数据的数据成员a
则没有初始化。
派生类的对象有两个数据成员data
:一个是通过类型信息继承的(名称隐藏在派生类中),另一个是派生类自己的数据成员。
基类对派生类的数据成员data
一无所知。
您可以在类信息中定义一个虚函数。例如
#include <iostream>
class Parent
{
public:
struct info
{
int a;
virtual void set( int a )
{
this->a = a;
}
};
info data;
virtual void main(void);
};
void Parent::main()
{
data.set( 1 );
}
class Child: public Parent
{
public:
struct info2: public info
{
int b;
void set( int a ) override
{
this->a = a;
}
};
info2 data;
virtual void main(void);
};
void Child::main(void)
{
data.set( 3 );
data.b = 2;
std::cout << data.a << "\n";
std::cout << data.b << "\n";
}
int main(void)
{
Parent *base;
Child derived;
base = &derived;
base->main();
return 0;
}
程序输出为
3
2
关于c++ - 嵌套结构属性继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57997870/