2011-01-14 54 views
0

我使用了許多抽象類,它們只定義了純虛函數和虛擬(非純)析構函數。接口的鑽石問題

在沒有使用虛擬繼承的情況下繼承鑽石結構還可以嗎? (我想確保即使某些程序員不知道他應該使用虛擬繼承也沒有問題。)什麼是一個很好的資源,它給出了有關此主題的簡短但完整的概述?

謝謝!

回答

5

你不行。沒有虛擬繼承,繼承圖只是不是鑽石。如果Derived繼承自LeftRight,並且二者都從Base非虛擬地導出,則每個Derived對象將會有兩個子對象。

+0

如果Base只有純虛擬方法會怎樣? – Philipp 2011-01-14 08:49:44

+0

你仍然有兩個副本。這意味着你可以從一個Derived *獲得兩個不同的`Base *`值。並考慮一個通用的vtable實現:兩個`Base`subject都會有自己的vptr。 – MSalters 2011-01-14 10:14:32

5

虛擬繼承是你得到鑽石的機制 - 如果你不使用虛擬繼承,那麼你有兩個不同的公共基類副本 - 這不是真的鑽石,可能不是你想要的。

2

This faq通過示例爲多重繼承提供了很好的答案。

對於鑽石,你必須有虛擬繼承。