2013-11-24 67 views
0

我剛纔讀Constructors and initialization of derived classes
而且我遇到了一個問題。代碼如下。
問題是我評論父親的默認構造函數時。將會出現錯誤。
但是,默認的構造函數不應該由編譯器自動創建?
謝謝你回答我的問題。當派生類構造函數初始化列表時,基類沒有默認構造函數

#include <iostream> 
using namespace std; 
class Father{ 
public: 
    int food; 
    Father(){} // father default constructor 
    Father(int f):food(f){ 
    } 
}; 
class Child: public Father{ 
public: 
    int beverage; 
    Child(int b):beverage(b){ 
    } 
}; 
int main(int argc, const char * argv[]) 
{ 
    Child c(10); 
    return 0; 
} 

回答

3

如果至少存在用戶定義的構造函數,則不會生成默認構造函數。在你的情況下,你有一個。

2

如果您聲明瞭非默認構造函數,編譯器將不會創建默認值。

我建議使用default關鍵字作爲默認構造函數,所以每個人都會立即看到它的功能。

0

你的子ctr調用父ctr,它必須。它會調用默認值,除非您聲明不這樣做。運行下面的代碼,然後切換哪個Child ctr被評論,然後你會看到。

class Father{ 
public: 
    int food; 
    Father(){ cout<<"father::default\n";} // father default constructor 
    Father(int f):food(f){ 
    } 
}; 
class Child: public Father{ 
public: 
    int beverage; 
// Child(int b): beverage(b){} 
    Child(int b): Father(45), beverage(b){ } 
}; 


int main(int argc, const char * argv[]) 
{ 
    Child c(10); 
    return 0; 
} 

所以,如果你想獲得默認構造函數的ID,你需要明確調用別人的一個從子類點擊率的動初始化列表中。

相關問題