2015-08-14 25 views
1

我的代碼:存在中間階級的不執行參數化基類的構造

class Parent 
{ 
public: Parent() { cout << "Default Parent" << endl; } 
     Parent(int x) { cout << "Parameterized Parent" << endl; } 
}; 
class Child1: virtual public Parent 
{ 
public: Child1() :Parent(10) { cout << "Default Child1" << endl; } 
}; 
class Child2: virtual public Parent 
{ 
public: Child2() :Parent(10) { cout << "Default Child1" << endl; } 
}; 
class GrandChild: public Child1, public Child2 
{ 
public: 
    GrandChild() { cout << "Default GrandChild" << endl; } 
}; 
int main() 
{ 
    GrandChild G; 
    return 0; 
} 

輸出:

default Parent 
default Child1 
default Child2 
default GrandChild 

我知道這裏最派生類中調用父類的默認構造函數,除非另有規定。

但爲什麼ChildX類的參數化父構造函數調用從未得到執行?沒有ChildX類,GrandChild類不能存在(?)。沒有參數化調用,ChildX類將不會被創建(?)。

回答

2

我知道這裏最派生類調用父類的默認構造函數,除非另有指定。

還有比這更多的東西。最具派生類總是負責初始化虛擬基類。沒有例外!

如果最派生類的構造函數沒有爲虛擬基類指定mem初始化程序,則虛擬基類是默認構造的。如果「中間」類爲虛擬基類指定元初始化程序,則無關緊要。那些簡單地被忽略。它們是只有這個類是正在構造的派生類最多的。

MEM-初始化其中MEM-初始化-ID表示任何類,它是不是最派生類的構造函數的執行期間的虛擬基類被忽略。

(C++ 14標準,[class.base.init]/7)

+0

爲什麼不編譯器會給出關於忽略初始化一個警告? – InQusitive

+0

@Inteusitive不值得警告; 「Child1」和「Child2」想要在派生類最多的時候初始化虛擬基地,而「GrandChild」想要以不同的方式進行初始化,沒有什麼明顯的錯誤。 – Brian

+1

@Brian有一個特例:在抽象類中,該初始化器永遠不會被執行。 – curiousguy

相關問題