2011-08-13 57 views
7

這裏是我的觀察:當編譯器會生成默認的構造函數派生類

編譯器不會生成一個派生類,其基類中定義構造函數默認構造函數。

// example 
class ClassCBase 
{ 
public: 
    ClassCBase(int i) {} 
}; 

class ClassC : public ClassCBase 
{ 

}; 

int main() 
{ 
    ClassC c; // error C2512: 'ClassC' : 
       // no appropriate default constructor available 
} 

Q1>我理解正確嗎?

Q2>是否有任何其他情況下,編譯器將不會產生派生類的默認構造?

+0

也許這些錯誤消息更好地描述了這種情況:http://ideone.com/Fy8uw – UncleBens

回答

8

編譯器不會生成一個默認的構造函數,如果超類沒有默認構造函數。換句話說,由於超類構造函數需要一個參數,並且編譯器不能期望知道什麼是合適的默認值,編譯器將無法生成有用的默認構造函數。但是如果您向ClassCBase添加無參數構造函數,則ClassC將按原樣可用。

+3

它將生成一個(只要沒有其他構造函數),但構造函數的生成將導致編譯時錯誤因爲它要求超類具有無參數構造函數。 –

+2

編譯器是否聲明/定義了一個默認構造函數沒有什麼價值。該標準說該程序是不合格的,每個編譯器都要選擇如何報告錯誤。 –

5

如果基類沒有默認構造函數,編譯器將不會定義一個隱含的默認構造函數(不只是「申報」的定義是這裏的關鍵)派生類。 (可以不帶參數調用任何構造函數是默認的構造函數,不管實際的簽名,只要提供默認參數。)

因此,我們可以總結爲要求的任何類有一個良好形成隱含定義的構造函數:

  • 沒有const成員。
  • 無參考成員。
  • 所有的基類都必須有訪問默認的構造函數。
  • 所有非靜態成員必須擁有訪問默認的構造函數。
+0

可以說,編譯器將定義默認construtor派生類,如果使用它,而是因爲是形成不良的,它需要產生的構造,是形成不良的節目。 –

+0

@Charles:的確,我在文中加入了「格式良好」。 –

+0

考慮第一段,也許「編譯器將無法定義...」更好地描述了原因/結果。我不確定。 –

相關問題