我知道編譯器給出歧義的錯誤,如果我們沒有提到虛擬關鍵字,而導出鑽石問題中的子類。那麼虛擬關鍵字如何消除這種歧義?虛擬關鍵字如何解決多繼承中的歧義問題?
0
A
回答
0
class Base {
public:
// ...
protected:
int data_;
};
class Der1 : public virtual Base {
↑↑↑↑↑↑↑ // This is the key
public:
// ...
};
class Der2 : public virtual Base {
↑↑↑↑↑↑↑ // This is the key
public:
// ...
};
class Join : public Der1, public Der2 {
public:
void method()
{
data_ = 1; // Good: this is now unambiguous
}
};
int main()
{
Join* j = new Join();
Base* b = j; // Good: this is now unambiguous
}
如果沒有指定繼承虛擬,編譯器會嘗試在Derived
對象添加兩個Base
類,那就不知道哪data_
填寫你會有兩個在你的派生類中相同的對象。 聲明繼承爲virtual
告訴編譯器,您只需要派生類中的基類的一個實例。
+0
謝謝dau_sama。在這種情況下,Join類的大小是12,其中包括2個虛擬指針Der1,Der2和4個data_(我認爲)。這是對的嗎?編譯器還使用哪個路徑來維護Base對象的單個副本? – DevMJ
+0
我認爲這在gcc/x86中是正確的,但它是實現定義的。可能在其他架構上,它可能以不同的方式實現。 在這種簡單的情況下,編譯器只知道它只需要在內存佈局中保留一個實例的基礎對象。 –
相關問題
- 1. 虛擬繼承如何解決「菱形」(多重繼承)歧義?
- 2. 多重虛擬繼承歧義
- 3. 關於C++接口(純虛擬類)/多繼承/虛繼承的設計問題
- 4. 問題在虛擬繼承
- 5. C++解決菱形繼承如果沒有虛擬繼承
- 6. 多虛擬繼承
- 7. 純虛擬繼承,多繼承和C4505
- 8. 解決C#中的繼承問題
- 9. 虛擬繼承
- 10. 虛擬繼承
- 11. 虛擬繼承
- 12. 解決多繼承
- 13. 關於多繼承和虛繼承
- 14. C++中的虛擬繼承
- 15. 多態性/繼承問題與虛擬類的成員函數
- 16. 如何解決歧義
- 17. 解決歧義
- 18. 解決歧義
- 19. C++ - 虛擬繼承
- 20. C++:虛擬繼承
- 21. C++中的虛擬與非虛擬多重繼承
- 22. Java8中鑽石問題解決或多重繼承的規則
- 23. 虛擬關鍵字
- 24. BuildManager解決頁面繼承問題
- 25. 如何解決HttpServerUtility.TransferRequest中的「預計虛擬路徑」問題?
- 26. 用LALR解析器解決我語法中的歧義問題
- 27. 不得不定義多級繼承中的純虛擬
- 28. 的在C++虛擬繼承
- 29. Python中超級關鍵字的繼承問題?
- 30. 關於C++多重繼承的問題?
明顯的重複:[虛擬繼承如何解決「菱形」(多繼承)歧義?](http://stackoverflow.com/q/2659116/1149924) – kkm