簡體   English   中英

虛擬繼承與抽象中產階級

[英]Virtual inheritance with abstract middle class

這不是關於如何做的問題,我對虛擬繼承非常了解,並且我知道一些避免該問題的方法-但我對此都不滿意。

這是一些無法編譯的代碼:

struct BottomClass
{
    BottomClass(int& ref) : ref(ref) {}
    int& ref;
};

struct MiddleClassA : virtual public BottomClass
{
    MiddleClassA() /*: BottomClass()*/ {}
    virtual ~MiddleClassA() = 0;
};

MiddleClassA::~MiddleClassA(){}

struct MiddleClassB : virtual public BottomClass
{
    MiddleClassB() /*: BottomClass()*/ {}
    virtual ~MiddleClassB() = 0;
};

MiddleClassB::~MiddleClassB(){}

struct TopClass final : public MiddleClassA, public MiddleClassB
{
    TopClass(int& ref) : BottomClass(ref) {}
};

void main()
{
    int someInt;
    TopClass variable(someInt);
}

令我困擾的是為什么它無法編譯。 我知道BottomClass沒有默認的構造函數,因此MiddleClassX格式錯誤。 但是MiddleClassX是抽象類! 即使我指定了構造函數,在任何情況下都不會使用它……那為什么還要指定呢?

我什至無法提供一個明智的構造函數,因為MiddleClassX沒有任何合理的值可以提供給BottomClass。

我的問題是:是否有解決此問題的優雅方法?


我自己有一些解決方案,但是我特別不喜歡其中任何一個:

1)我可以創建一個BottomClass默認構造函數,該構造函數使用一些垃圾值構造其ref。 然后在該構造函數中使用assert(),因此我知道它永遠不會被調用...當然,這導致我不得不對所有應該是編譯時錯誤的內容進行運行時檢查,並且實際上還要求存在要獲取引用的垃圾整數。

2)我可以將引用傳遞給每個抽象的中產階級,並使用它……但這會導致信息的嚴重重復,並且當這些鏈變得很長時(如它們所做的那樣),維護該鏈非常繁瑣。 另外,必須向每個類傳遞一個額外的變量也會對性能造成影響。

(如果我的問題很難理解,我深表歉意。如果有人能更好地描述我的難題,那我將被用語言表達出來)

即使我指定了構造函數,在任何情況下都不會使用它

錯誤。 派生類使用抽象類的構造函數。 畢竟,抽象類仍然可能需要初始化,關於抽象類的唯一特殊之處是您不能直接構造它們; 僅允許派生類構造它們,並且僅作為其自身構造的一部分。

不能派生沒有構造函數的抽象類,就像不能派生任何其他沒有構造函數的類一樣。

您的第二個解決方案是正確的。 如果內聯的構造函數是內聯的,那么根本不會影響性能。

(順便說一下,這與虛擬繼承完全無關。您將在非虛擬繼承中遇到相同的問題。)

為什么不聲明默認構造函數...

BottomClass();  // deliberately undefined; use Bottom(int&)

...並保持未定義狀態-最糟糕的是,如果實際嘗試使用鏈接時,則會出現鏈接時錯誤。

ideone.com

暫無
暫無

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

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