如果您位於派生類的構造函數中,並且未對基類構造函數進行顯式調用,那麼編譯器如何知道要使用哪個基構造函數?構造函數如何在C++中選擇一個基類構造函數
2
A
回答
3
如果在構造函數initializer list中沒有提到基類,它將是default initialized。由於基類肯定是類的類型,這意味着將調用default constructor。
其中兩個引用也有隱式調用基類默認構造函數的派生類的示例。例如:
struct Class : public Base
{
unsigned char x;
unsigned char y;
Class (int x)
: Base (123), // initialize base class
x (x), // x (member) is initialized with x (parameter)
y { 0 } // y initialized to 0
{} // empty compound statement
Class (double a)
: y (a+1),
x (y) // x will be initialized before y, its value here is indeterminate
{} // base class constructor does not appear in the list, it is
// default-initialized (not the same as if Base() were used, which is value-init)
...
};
1
它使用默認的構造,如通過標準的在N4140 初始化鹼和成員,§12.6.2[class.base.init]/8(重點煤礦)規定:
在非委託構造,如果給定的潛在的構造子對象不是由MEM-初始化-ID (包括的情況下指定其中不存在MEM-初始化列表因爲構造沒有ctor -initializer) 然後
如果實體是具有撐 - 或等於初始值設定的非靜態數據成員,要麼
- 構造的類是聯合,並且沒有該聯盟的其他變體成員被指定爲mem-initializer-id或
- 構造函數的類不是聯合體,並且如果實體是匿名聯合的成員,該聯合的ER構件由MEM-初始化-ID指定,如在8.5指定
實體被初始化;
否則,如果實體是匿名聯合或變體成員,則不執行初始化;
- 否則,實體默認初始化爲。
注意,基類潛在構造每特殊成員函數子對象,§12[特殊]/5:
對於一類,它的非靜態數據成員,其非 - 虛擬直接基礎類,如果該類不是抽象類,則將其虛擬基類稱爲其潛在構造的子對象。
相關問題
- 1. C++類構造函數/析構函數
- 2. 構造函數中的調用基構造函數和其他構造函數
- 3. 呼叫基類構造函數在C#
- 4. C++ - 構造函數,其中使用的參數基類'構造函數
- 5. Move構造函數調用基類移動構造函數
- 6. 從基類構造函數訪問子構造函數
- 7. 確定一個構造函數調用其基類的構造
- 8. 在構造函數中調用另一個構造函數
- 9. C++如何寫一個構造函數?
- 10. 基類的拷貝構造函數(C++)
- 11. 來自基類的C++構造函數
- 12. Objective-C類構造函數
- 13. C++類構造函數()
- 14. 如何使用基類構造函數
- 15. 默認構造函數與正常構造函數的類C++
- 16. 如何將基礎構造函數數據用於同一個類中的另一個構造函數?
- 17. .Net如何爲分部類構造一個構造函數?
- 18. 選擇類的構造函數
- 19. 在構造函數中調用類成員的構造函數
- 20. 在構造函數中調用不同類的構造函數?
- 21. 如何在其他構造函數中調用構造函數?
- 22. 如何在構造函數中訪問構造函數成員?
- 23. C#構造函數
- 24. C++類,構造函數和函數
- 25. 在基類構造函數中構造對象?
- 26. 構造函數內的構造函數
- 27. 類構造函數
- 28. 構造函數可以在C++中調用另一個構造函數嗎?
- 29. C++ 11:委託構造函數 - 不能選擇構造函數模板?
- 30. 基類構造函數在派生類構造函數之前真的調用
它使用默認的構造函數。 –