我有一个POD结构,它来自一个包含许多数据字段的库:
struct A {
int foo1;
float foo2;
...
};
现在我想扩展它以添加一些自定义数据,并考虑到这一点:
struct B : public A {
int bar1;
bool bar2;
};
从A
的实例创建B
的实例的好方法是什么?这不起作用:
A a;
B b = a;
(编辑:删除了添加构造函数B(A const &)
的建议,OP的更新建议不应修改给定的结构。)
您可以创建一个B
,然后使用编译器生成的A::operator=(A&)
:
A a = { whatever };
B b = { whatever };
static_cast<A &>(b) = a;
如果不坚持继承,从A开始就可以了
内存布局没有变化。
对于继承,分两步进行:
- 创建派生:
B b;
- 而是使用0-init:
B b = {0};
- 而是使用0-init:
- 复制所有成员:
(A&)b = a
编译器应该能够对此进行优化。
无论如何,如果可能的话,从派生的开始,而不是复制。
使结构B包含类型a的成员。
试试这个:
b = dynamic_cast<B*>(a);