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

How the compiler do composition in inheritance C++?

本文关键字:组合 C++ 继承 编译器      更新时间:2023-10-16

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

我不会让这件事对你来说过于简单,因为它看起来确实像家庭作业。如果你能仔细思考并理解下面的内容——祝你好运。。。。

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

如果您需要演示基本原理,可以使用的一些变体

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

当然,它是简化的,但它表明基础是在派生之前建造的,构件是在执行构造体之前建造的。它还表明,破坏是按照与建造相反的顺序进行的。

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