對不起,如果這個問題已經問了很多次,但希望通過自己提問來更快地找到信息。所以,問題是:超類中的默認構造函數是否有可能從它繼承?假設每個派生類的構造函數都明確地調用了一個超類構造函數,提供了正確的參數 - 這樣的代碼是否工作?如果有需要,我可以提供一段代碼片段來澄清我在說什麼。提前致謝。C++:一個必須具有默認超類構造函數的繼承?
回答
在超類中有一個默認構造函數是否有可能從它繼承的可能性?
號
如果你沒有在基類的默認構造函數,你需要從派生類的構造函數的成員初始化列表中調用基類的構造函數的參數(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
作爲參數。
這尤其意味着編譯器不會爲派生類自動生成默認構造函數。只是在說'。 – 2012-03-23 10:12:02
@MatthieuM。如果您提供任何構造函數,編譯器將不會自動生成一個構造函數。如果基類沒有默認構造函數,並且編譯器試圖爲派生類生成默認構造函數,那將是一個錯誤。 – 2012-03-23 10:18:47
@JamesKanze:是的,我試圖指出,如果基類沒有默認構造函數,那麼您一定需要爲派生類提供至少一個構造函數。 – 2012-03-23 11:02:26
只要
- 默認構造方法中沒有明確地叫
- 所有子類都在建設調用用戶定義的超類的構造函數與參數
不強制寫默認構造函數。
如果子類的每個構造函數都使用父類的顯式構造函數,則不需要父類具有默認構造函數。
如果你有一個沒有默認構造函數的類,每個人都被迫在實例化時使用一個顯式的構造函數,對吧?這是一個概念,如果所有的孩子都確保從不調用默認的構造函數,那麼就沒有必要實現它。
不,有一個可能的例外。通常,基類構造函數 將由其派生類立即調用,使用該派生類提供的參數 (如果有的話)。如果所有的 直接派生類都明確地初始化基類,那麼不需要任何 默認構造函數。
一個可能的例外是,如果你從類基地 虛擬繼承。在這種情況下,它不是 初始化基類,而是派生類最多的直接派生類。並根據 關於如何組織您的類層次結構,您可能不希望最基本的派生類知道;大多數派生類只需知道它直接從中繼承 的類就足夠了。 (當然,這是一個理想情況,並不總是如此。)幸運的是,幾乎每次發生這種情況時,基數都是一個沒有數據的抽象類(因此具有默認構造函數)。但要注意的是 。
但就語言而言,可能的例外不是一項義務。即使在這種情況下,該語言也不會強制您擁有默認構造函數。它更多的是關於類層次結構的設計,以及程序員的選擇。 – Nawaz 2012-03-23 10:44:53
@Nawaz該語言不強制你有一個默認的構造函數,但是如果你沒有默認的構造函數,它確實會迫使你讓最基本的類已知基類。取決於體系結構,這可能不是理想的。 – 2012-03-23 11:56:35
不,你不需要默認的構造函數。以下編譯和運行,有或沒有私有的默認構造函數。
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);
}
- 1. 約束 - 派生類必須有一個默認構造函數
- 2. IXmlSerializable類型'System.Xml.Linq.XElement'必須具有默認構造函數
- 3. 沒有默認構造函數 - 繼承
- 4. 你必須有一個默認的構造函數嗎?
- 5. 從類繼承的類沒有默認的構造函數
- 6. 是規定必須有默認的構造函數在C++中
- 7. 沒有默認構造函數的C++繼承
- 8. 繼承構造函數和默認構造函數
- 9. 從超類繼承構造函數?
- 10. C++一個類的默認構造函數調用另一個類的另一個默認構造函數
- 11. 爲什麼具有繼承構造函數的類還會獲得合成的默認構造函數?
- 12. 具有默認參數的類繼承
- 13. 繼承類中的構造函數C++
- 14. C++繼承類的構造函數
- 15. 子類構造函數 - 爲什麼必須爲子類構造函數存在默認構造函數?
- 16. 使用默認構造函數繼承公共類的Java
- 17. C++繼承具有多個參數的構造函數[作業]
- 18. 構造函數的超類與子類繼承C++
- 19. C#繼承構造函數
- 20. 繼承:沒有適當的默認構造函數可用
- 21. 具有不一致構造函數的多級別類繼承
- 22. 如何避免繼承的類必須通過基類構造函數參數
- 23. 需要一個例子顯示默認的構造函數沒有繼承
- 24. 默認構造函數與正常構造函數的類C++
- 25. 具有參數構造函數的基類的繼承
- 26. 構造函數調用必須與繼承
- 27. C++,默認構造函數
- 28. 類默認構造函數
- 29. 不能繼承基控制器類沒有默認的構造函數
- 30. 父類默認構造函數由用戶輸入,然後通過繼承 - C++
答案當然要看情況。例如,你有沒有「超類」中的任何類型的數據? – 2012-03-23 10:10:31
@MrLister,我正在談論你可以想象的最簡單的例子。請說明「它取決於」是什麼意思。 – Egor 2012-03-23 10:13:04
查看答案。如果沒有成員在父類中初始化,則根本不需要編寫任何構造函數。編譯器將隱含地創建一個默認構造函數。 – 2012-03-23 10:17:18