C++ 从基创建派生结构
我有一个包含许多数据字段的库中的POD结构:C++ 从基创建派生结构,c++,C++,我有一个包含许多数据字段的库中的POD结构: struct A { int foo1; float foo2; ... }; 现在,我想对其进行扩展,添加一些自定义数据,并考虑以下内容: struct B : public A { int bar1; bool bar2; }; 从a实例创建B实例的好方法是什么?这不起作用: A a; B b = a; 如果你不坚持继承,从A开始就行。 内存布局没有变化 使用继承,分两步执行: 创建派生:B 而是使
struct A {
int foo1;
float foo2;
...
};
现在,我想对其进行扩展,添加一些自定义数据,并考虑以下内容:
struct B : public A {
int bar1;
bool bar2;
};
从a
实例创建B
实例的好方法是什么?这不起作用:
A a;
B b = a;
如果你不坚持继承,从A开始就行。
内存布局没有变化 使用继承,分两步执行:
B代码>
- 而是使用0-init:
bb={0}代码>
(A&)b=A
B(常量&)
,OP的更新建议不应修改给定的结构。)
您可以创建一个B
,然后使用编译器生成的a::operator=(a&)
:
A={whatever};
B={无论如何};
静态_cast(b)=a;
使结构B包含类型a的成员。尝试以下操作:
b = dynamic_cast<B*>(a);
b=dynamic_cast(a);
问题是吊舱失去了稳定性-(.以及默认构造函数。第二个版本保留POD ness(但不允许初始化形式)@重复数据消除程序“标准布局”是新的POD,添加ctor不会使B成为非标准布局。@WernerHenze:添加ctor会删除默认的ctor,使其不平凡,从而成为非POD。无论如何,这不再重要。POD和标准布局仍然是不同的。@重复数据消除器您是对的,POD仍然存在于C++11中,POD和标准布局是不同的(我的错)。我想也许OP写了POD,但可以使用标准布局。@Two:对不起,我的演员阵容放错了。更正。当然是C++风格的演员阵容preferred@MattMcNabb:仅在至少有轻微机会进行错误转换的情况下。此处不适用。dynamic_cast
仅当底座具有虚拟功能时才可使用
b = dynamic_cast<B*>(a);