[英]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&)
...並保持未定義狀態-最糟糕的是,如果實際嘗試使用鏈接時,則會出現鏈接時錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.