Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从基创建派生结构_C++ - Fatal编程技术网

C++ 从基创建派生结构

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 而是使

我有一个包含许多数据字段的库中的POD结构:

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);