簡體   English   中英

虛繼承基構造函數消除

[英]virtual inheritance base constructor elimination

struct A3 {
    int x;
    A3(int x_): x(x_) {cout << "A3: " << x_  << endl;}
};
struct B3: virtual public A3 {
    B3(int x_): A3(x_) {cout << "B3: " << x_  << endl;}
};
struct C3: virtual public A3 {
    C3(int x_): A3(x_) {cout << "C3: " << x_  << endl;}
};
struct D3: B3, C3 {

    D3(int x_): A3(x_), B3(x_), C3(x_) {cout << "D3: " << x_  << endl;}
};

對於上面的代碼:輸出是 A3、B3、C3、D3。 似乎編譯器消除了 B3 和 C3 中對 A3 的調用。 消除是如何工作的? 這是否意味着我們只能從 D3 調用 A3 的構造函數?

消除是如何工作的?

這是一個實現細節,但這通常是由編譯器為一個類型發出兩個不同的構造函數來完成的。 當類型是基類時使用一個構造函數,當它是最派生的對象類型時使用另一個構造函數。

當存在虛擬基時,c'tor 的基類版本不包含對虛擬 c'tor 的調用。 而 c'tor 的最派生對象版本確實包含對虛擬基的 c'tor 的調用。

由於編譯器知道在什么上下文中使用該類型,它可以選擇適當的 c'tor 來調用。

這是否意味着我們只能從 D3 調用 A3 的構造函數?

我們只能從最派生的對象類型調用它。 如果該類型為D3 ,則它是唯一會調用A3的 c'tor 的 c'tor。

實際上,在這種情況下只創建了一個 A3 實例,所以是的,我們只能從 D3 隱式調用 A3 的構造函數,但在幕后,編譯器可以以任何方便的方式執行它。

暫無
暫無

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

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