我使用了許多抽象類,它們只定義了純虛函數和虛擬(非純)析構函數。接口的鑽石問題
在沒有使用虛擬繼承的情況下繼承鑽石結構還可以嗎? (我想確保即使某些程序員不知道他應該使用虛擬繼承也沒有問題。)什麼是一個很好的資源,它給出了有關此主題的簡短但完整的概述?
謝謝!
我使用了許多抽象類,它們只定義了純虛函數和虛擬(非純)析構函數。接口的鑽石問題
在沒有使用虛擬繼承的情況下繼承鑽石結構還可以嗎? (我想確保即使某些程序員不知道他應該使用虛擬繼承也沒有問題。)什麼是一個很好的資源,它給出了有關此主題的簡短但完整的概述?
謝謝!
你不行。沒有虛擬繼承,繼承圖只是不是鑽石。如果Derived
繼承自Left
和Right
,並且二者都從Base
非虛擬地導出,則每個Derived
對象將會有兩個子對象。
虛擬繼承是你得到鑽石的機制 - 如果你不使用虛擬繼承,那麼你有兩個不同的公共基類副本 - 這不是真的鑽石,可能不是你想要的。
This faq通過示例爲多重繼承提供了很好的答案。
對於鑽石,你必須有虛擬繼承。
如果Base只有純虛擬方法會怎樣? – Philipp 2011-01-14 08:49:44
你仍然有兩個副本。這意味着你可以從一個Derived *獲得兩個不同的`Base *`值。並考慮一個通用的vtable實現:兩個`Base`subject都會有自己的vptr。 – MSalters 2011-01-14 10:14:32