假設我有一個菱形繼承情況如下:爲什麼下面的類有一個虛擬表?
class A{
public: virtual void foo(){};
};
class B: public virtual A{
public: virtual void foo(){};
};
class C: public virtual A{
public: virtual void foo(){};
};
class D: B, C{};
最後一行產生了編譯錯誤引用歧義。據我瞭解,問題在於編譯器不知道在D的vtbl中放置哪個foo,但是爲什麼如果它沒有定義它自己的虛擬函數,甚至會存在D的vtbl?
「虛擬」作爲保護級別說明符,即使在您的類聲明行上有效(例如,類B:虛擬A)? – Joe 2010-02-09 00:52:13
這不是保護說明符。它表示一個虛擬的基類,這是一種解決鑽石問題的法律手段。 – 2010-02-09 00:53:43
啊,對,謝謝。 – Joe 2010-02-09 01:03:04