簡體   English   中英

如果不為具有不同簽名的不同派生構造函數調用基類的構造函數,會發生什么情況?

[英]What happens if you don't call a base class's constructor for different derived constructors with different signatures?

假設我有一個 base 和 derived class 這樣的:

class Base {
public:
    Base() { ... };
    Base(int param) { ... };
};

class Derived : public Base {
public:
    Derived() { ... };
    Derived(int param) { ... };
    Derived(int p1, int p2) { ... };
};

請注意,我沒有Derived的構造函數顯式調用Base的任何構造函數。 也就是說,我沒有Derived(): Base() {... }Derived(int param): Base(param) {... }

創建Derived的實例時,默認情況下會調用Base的任何構造函數嗎?

如果是這樣,是在使用Derived(int param)時調用Base(int param) ) 還是調用Base()

換句話說,如果您不指定要使用哪個構造函數,C++ 是否總是默認使用與派生類的構造函數具有相同簽名的基類構造函數? 或者它只是使用基類的默認構造函數?

如果是前者,那么在派生的 class 中使用構造函數時,如果在基類 class 中沒有具有相同簽名的匹配構造函數,例如Derived(int p1, int p2)怎么辦?

請注意這個問題與 class 的成員變量的初始化無關。我有意沒有在我的偽代碼中包含任何成員變量。 如果您沒有在派生類的構造函數中顯式指定基構造函數,它特別與使用基 class 上的哪個構造函數有關。

引用 cppreference 對構造函數的描述以及 inheritance 與它們的關系:

在構造函數主體forms function 復合語句開始執行之前,所有直接基類、虛基類和非靜態數據成員的初始化已經完成。 成員初始化器列表是可以指定這些對象的非默認初始化的地方。 對於不能默認初始化的基類和非靜態數據成員,例如引用成員和 const 限定類型,必須指定成員初始化器。 不對沒有成員初始值設定項的匿名聯合或變體成員執行任何初始化。

(強調已添加。)

如果您沒有在派生類的構造函數的成員初始化列表中指定基類 class 子對象的初始化,則基類 class 子對象將被默認初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM