2012-03-23 94 views
1

對不起,如果這個問題已經問了很多次,但希望通過自己提問來更快地找到信息。所以,問題是:超類中的默認構造函數是否有可能從它繼承?假設每個派生類的構造函數都明確地調用了一個超類構造函數,提供了正確的參數 - 這樣的代碼是否工作?如果有需要,我可以提供一段代碼片段來澄清我在說什麼。提前致謝。C++:一個必須具有默認超類構造函數的繼承?

+0

答案當然要看情況。例如,你有沒有「超類」中的任何類型的數據? – 2012-03-23 10:10:31

+0

@MrLister,我正在談論你可以想象的最簡單的例子。請說明「它取決於」是什麼意思。 – Egor 2012-03-23 10:13:04

+0

查看答案。如果沒有成員在父類中初始化,則根本不需要編寫任何構造函數。編譯器將隱含地創建一個默認構造函數。 – 2012-03-23 10:17:18

回答

7

在超類中有一個默認構造函數是否有可能從它繼承的可能性?

如果你沒有在基類的默認構造函數,你需要從派生類的構造函數的成員初始化列表中調用基類的構造函數的參數(S)明確

實施例,

class base 
{ 
    public: 
    base(std::string const & s, int n); 
}; 

class derived : public base 
{ 
    anotherClass obj; 
    public: 
    derived() : base("string", 10), obj(100) 
    {  //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ member-initialization list 
    } 
}; 

base("string", 10)的語法。它調用基類的構造函數,傳遞"string"作爲第一個參數,10作爲第二個參數。

還要注意obj(100)它初始化成員變量這是anotherClass類型:obj(10)調用的anotherClass構造這需要int作爲參數。

+2

這尤其意味着編譯器不會爲派生類自動生成默認構造函數。只是在說'。 – 2012-03-23 10:12:02

+1

@MatthieuM。如果您提供任何構造函數,編譯器將不會自動生成一個構造函數。如果基類沒有默認構造函數,並且編譯器試圖爲派生類生成默認構造函數,那將是一個錯誤。 – 2012-03-23 10:18:47

+2

@JamesKanze:是的,我試圖指出,如果基類沒有默認構造函數,那麼您一定需要爲派生類提供至少一個構造函數。 – 2012-03-23 11:02:26

3

只要

  • 默認構造方法中沒有明確地叫
  • 所有子類都在建設調用用戶定義的超類的構造函數與參數

不強制寫默認構造函數。

2

如果子類的每個構造函數都使用父類的顯式構造函數,則不需要父類具有默認構造函數。

如果你有一個沒有默認構造函數的類,每個人都被迫在實例化時使用一個顯式的構造函數,對吧?這是一個概念,如果所有的孩子都確保從不調用默認的構造函數,那麼就沒有必要實現它。

2

不,有一個可能的例外。通常,基類構造函數 將由其派生類立即調用,使用該派生類提供的參數 (如果有的話)。如果所有的 直接派生類都明確地初始化基類,那麼不需要任何 默認構造函數。

一個可能的例外是,如果你從類基地 虛擬繼承。在這種情況下,它不是 初始化基類,而是派生類最多的直接派生類。並根據 關於如何組織您的類層次結構,您可能不希望最基本的派生類知道;大多數派生類只需知道它直接從中繼承 的類就足夠了。 (當然,這是一個理想情況,並不總是如此。)幸運的是,幾乎每次發生這種情況時,基數都是一個沒有數據的抽象類(因此具有默認構造函數)。但要注意的是 。

+0

但就語言而言,可能的例外不是一項義務。即使在這種情況下,該語言也不會強制您擁有默認構造函數。它更多的是關於類層次結構的設計,以及程序員的選擇。 – Nawaz 2012-03-23 10:44:53

+0

@Nawaz該語言不強制你有一個默認的構造函數,但是如果你沒有默認的構造函數,它確實會迫使你讓最基本的類已知基類。取決於體系結構,這可能不是理想的。 – 2012-03-23 11:56:35

0

不,你不需要默認的構造函數。以下編譯和運行,有或沒有私有的默認構造函數。

class A { 
public: 

    A(int i) { 
    m = i; 
    } 

private: 

    A() { } // This line can be commented out. Included only to make point 

    int m; 
}; 

class B : A { 
public: 

    B(int i) 
    : A(i) 
    { 
    } 

}; 

int main() { 
    B b(10); 
} 
相關問題