讓我們看看下面的代碼片段:虛繼承和函數成員
struct A { void f(); };
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};
我能說什麼?該D
有兩個不同的成員函數B::A::f
和C::B::f
它們通過同一個對象調用?或者他們只是同一個成員函數的別名?
例如,對於非虛的情況下,
struct A { void f(); };
struct B : A {};
struct C : A {};
struct D : B, C {};
D
有兩種不同的成員函數B::A::f
和C::A::f
,因爲他們只是有不同的名稱,因此,呼籲D().f()
是一個歧義,因爲我必須指定我想打電話給哪個成員。
但是,在虛擬inhericante的情況下,這不再是必需的,因爲通過一個或另一個路徑調用解決了通過同一個對象調用函數,我不知道在虛擬繼承的情況下,我有兩個不同的成員函數可以解析或在同一個對象上執行,或者它們只是同一個成員函數的別名。
無論如何,從實際的角度來看,差異並不重要,但從更正式的觀點來看,我不知道該說些什麼。
@Bon總之,我不知道有多少成員函數(不考慮默認生成的成員)有D. –
你剛剛重新發現了什麼是虛擬繼承:P – user463035818