[英]How the compiler do composition in inheritance C++?
編譯器如何在繼承中進行合成?
假設我創建一個派生類的對象,其中基類和派生類都通過其他類的composition對象包含。 我想要一些示例來解釋構造函數和析構函數。
考慮到它確實看起來像是家庭作業,我不會為您提供太多便利。 如果您可以仔細考慮並理解下面的內容,請祝您好運...。
調用基類的構造函數,該構造函數將-對於每個成員變量,按照基類中的聲明順序-調用與基類初始化列表中指定的參數相對應的構造函數,或調用默認的構造函數(如果有的話)(否則該成員的未初始化,盡管有時(例如,由於較new (p) T()
表示法或static
new (p) T()
,對象包含在其中的對象的早期零初始化(無論如何將始終保證特定的值)。 然后,派生的構造函數對其自己的數據成員執行相同的操作。 破壞發生的順序相反。
如果您需要證明基本原理,則可以使用以下幾種變體:
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; }
};
當然,它是經過簡化的,但是它表明基數是在派生之前構造的,成員是在構造函數體執行之前構造的。 它也表明破壞是按照相反的順序進行的。
但這只是最明顯的。 您還應該顯示一些示例,這些示例演示在存在多個成員時按什么順序構造成員,以及在多重繼承中發生的情況以及靜態成員的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.