嵌套结构属性继承
Nested struct attributes inheritance
我读到你可以通过使用继承来扩展结构。我有一个派生类,我希望在其中具有与其父级相同的结构,但扩展了更多字段。这似乎有效,但是当我从修改结构的 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 and 2
打印0 and 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
你是完全正确的,Parent::main()
无法访问Child::data
,并且对任何神话中的info2
类型一无所知; 对它来说,Parent::data
就是全部,info
是它的类型。
有几种简单的方法可以使Child::main()
使用Child::data
而不是Parent::data
,或者让它从每个版本访问所需的字段,但我怀疑这不是你所追求的。 如果您希望Parent
和Child
看到相同的data
(分别作为info
和info2
(,则data
本身应该多态使用。 对于此示例,为了简单起见,我将使用常规指针(反过来,在访问data
的成员时,operator.
将替换为operator->
(,但我建议研究智能指针,例如std::unique_ptr
以简化内存管理。
class Parent
{
public:
struct info
{
int a;
// Chances are, it's going to be deleted through an info* no matter what it is. Therefore, virtual destructor.
virtual ~info() = default;
};
info* data; // Consider using a smart pointer here, like std::unique_ptr.
virtual void main(void);
virtual void output() const; // Just adding this for convenience.
// Default constructor now allows data to be supplied, or creates it if necessary.
Parent(info* dp = nullptr) : data(dp ? dp : new info) {}
// Correct destructor will always be called.
virtual ~Parent() { if(data) { delete data; } }
};
void Parent::main()
{
data->a =1;
}
我们现在删除字段Child::data
,取而代之的是Child
向Parent
的构造函数提供所需的data
。
class Child: public Parent
{
public:
struct info2: public info
{
int b;
};
//info2 data;
virtual void main(void);
void output() const override; // Just adding this for convenience.
Child() : Parent(new info2) {}
};
Child
在需要时,会将data
视为info2
而不是info
。
void Child::main(void)
{
Parent::main();
auto dataPtr = static_cast<info2*>(data); // In Child, we know data is an info2*.
dataPtr->b = 2;
// Just gonna move these to output(), for a cleaner illustration.
//std::cout << "Data->a: " << data->a << "n";
//std::cout << "Data->b: " << dataPtr->b << "n";
}
这将导致data
按预期工作,Parent
和Child
都具有正确的类型。
void Parent::output() const {
std::cout << "Parent:n";
std::cout << "> Data->a: " << data->a << "n";
}
void Child::output() const /*override*/ {
std::cout << "Child as ";
Parent::output();
auto dataPtr = static_cast<info2*>(data);
std::cout << "Child:n";
std::cout << "> Data->a: " << dataPtr->a << "n";
std::cout << "> Data->b: " << dataPtr->b << "n";
}
然后,这将按预期执行,如在 Koliru 上现场看到的那样。 请注意,如果您希望能够,例如,从预先存在的Parent
创建Child
,则需要添加一个可以从info
进行info2
的移动构造函数;您应该考虑遵循五法则,或使用智能指针而不是原始指针。;P
您必须使用以下代码:
void Child::main(void)
{
Parent::main();
data.b = 2;
std::cout << Parent::data.a << "n";
std::cout << data.b << "n";
}
- 嵌套结构属性继承
- 具有菱形继承结构的子类的大小似乎很奇怪
- 如何向类添加继承结构,请参阅"enable_share_on_this"
- 在C 中继承C结构并将其传递回C库是安全的吗?
- 来自无法识别的继承结构的本地声明
- 继承结构的类型转换导致g++编译错误
- C++ 将结构函数作为继承结构中函数的参数传递
- 私下继承结构
- 有没有办法避免在特定自定义类继承结构中使用虚拟方法
- 返回具有常量字符* 属性的结构
- 可以在C++中类继承结构
- 当使用代码块13.12时,Doxygen没有产生正确的继承结构
- C++11 中的 POD 和继承.结构的地址 == 第一个成员的地址
- 具有带函数指针的类私有成员的继承结构
- 这种c++继承结构可能吗?
- 重写采用继承结构的函数
- 将包含字符串属性的结构读取/写入二进制文件
- 此继承结构是否存在切片问题
- 如何从基类继承结构成员
- 如何在c++中创建继承结构时设置父成员