2012-04-03 91 views
6

基本的c + +問題我很確定。如果我有一個帶有不帶參數的構造函數的基類,並且只是初始化了一些受保護的成員,那麼派生類是否立即調用這個基構造函數,如果它與參數相匹配的話(如意,但不可能)有辦法迫使它從派生類自動調用基礎構造函數,而無需在派生類中明確告訴它這麼做?我問,因爲我正在寫各種包裝,有一些保護成員,我想初始化爲特定的值,然後我想派生和操作這個基類,以滿足我的需求,但我不喜歡外部用戶必須記住顯式調用基礎構造函數或在它們自己的構造函數中設置這些值。如何強制在派生類中調用基類構造函數?

+1

我有點迷失於你的問題的措辭,但如果基類有一個默認的/無參數的構造函數,它將被調用時如果未明確指定基類的初始化,則初始化派生類對象。 – birryree 2012-04-03 21:20:37

回答

8

是的,默認的基礎構造函數總是被調用,除非另有明確說明。

例如:

class A 
{ 
public: 
    A() { std::cout << "A"; } 
}; 

class B : A 
{ 
public: 
    B() {} 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

將輸出:

A 

通過 「明確規定,否則」 我的意思是,你可以在派生類中調用不同的構造函數:

class A 
{ 
public: 
    A() { std::cout << "A"; } 
    A(int) { std::cout << "AAA"; } 
}; 

class B : A 
{ 
public: 
    B() : A(1) {} //call A(int) 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

將輸出

AAA 

重要,如果你沒有一個默認的構造函數(聲明瞭一個非默認的構造函數,而不是默認的一個)或默認的構造函數是不可見的(標記爲private),你需要顯式調用派生類中的可用構造函數。

+0

假設唯一的構造函數類A有一個整數作爲參數,然後派生類有一個構造函數,它也接收一個int。基礎構造函數會被偶然調用嗎?或者是一個構造函數,如果它沒有參數,那麼它只被認爲是默 – FatalCatharsis 2012-04-03 22:40:02

+0

也是,最後的想法,如果它反之亦然,你在B中定義了一個帶有參數的構造函數,而在A中定義了一個無參數構造函數,A的構造函數會被調用嗎?也稱爲first,基類的默認構造函數或派生類的默認構造函數。 – FatalCatharsis 2012-04-03 22:59:13

2

如果您的基類有一個「默認構造函數」(一個不帶參數的構造函數;由您明確提供,或由編譯器隱式提供,因爲您沒有明確提供任何構造函數)類構造函數會自動調用它,除非您指定他們調用不同的構造函數。 (如果你的基類不是有一個「默認構造函數」,因爲你提供了一個或多個帶參數的構造函數,沒有不帶構造函數的構造函數,那麼它是一個編譯錯誤派生類的構造函數不能指出它所調用的基類構造函數)

相關問題