编译器如何在继承 C++ 中进行组合?

Posted

技术标签:

【中文标题】编译器如何在继承 C++ 中进行组合?【英文标题】:How the compiler do composition in inheritance C++? 【发布时间】:2015-03-20 08:24:34 【问题描述】:

编译器如何在继承中进行组合? 假设我创建了一个派生类的对象,其中基类和派生类都包含通过其他类的组合对象。我想要一些例子来解释构造函数和析构函数。

【问题讨论】:

好像是一道作业题。 【参考方案1】:

我不会让你觉得这太容易了,因为它确实看起来像家庭作业。如果你能思考并理解下面的内容 - 祝你好运......

基类的构造函数被调用,对于基类中的每个成员变量,按照声明的顺序调用基类初始化列表中指定的参数对应的构造函数或默认构造函数(如果有)(否则成员的未初始化,但有时,例如,对象包含的内存的早期零初始化 - 可能是由于new (p) T() 符号或static - 无论如何都会保证特定值)。然后,派生构造函数对其自己的数据成员执行相同的操作。破坏以相反的顺序发生。

【讨论】:

谢谢大家,这不是我的硬件!如果我想问一下,我会写在开始(帮我做我的家庭作业)就是这样...... @Khan:好的...我建议您编写几个类,其中包含一个构造函数和一个析构函数,可以打印出消息,然后尝试一些组合并自己看看。您可能会通过这种方式了解更多信息,包括接下来要问的问题。【参考方案2】:

如果您需要演示基本原理,可以使用以下变体:

struct M   // Marker
    int id;
    M(int i) : id(i)  cout << "\tconstruction M" <<id<< endl; 
    ~M()  cout << "\tdestruction M" <<id<< endl; 
;

struct B  //Base 
    M mb;
    B() : mb(1)  cout << "construction B (body finished)" << endl; 
    ~B()  cout << "destruction B (body finished)" << endl; 
;
struct D : public B  //Derived 
    M md;
    D() : md(2)  cout << "construction D (body finished)" << endl; 
    ~D()  cout << "destruction D (body finished)" << endl; 
;

当然是简化了,但是它表明基类是在派生之前构造的,成员是在构造函数体执行之前构造的。它表明破坏是按照与构造相反的顺序执行的。

但这只是最明显的。您还应该展示一些示例,说明当有多个成员时按什么顺序构造成员,以及在多重继承中会发生什么,以及静态成员的情况。

【讨论】:

以上是关于编译器如何在继承 C++ 中进行组合?的主要内容,如果未能解决你的问题,请参考以下文章

C++继承详解

C++继承详解

如何继承protobuf生成的C++类

将继承重构为在 C++ 中保持多态功能的组合

如何在 C++ 中进行耗时的三重组合 [关闭]

顶层父类的构建