2017-08-29 148 views
0

讓我們看看下面的代碼片段:虛繼承和函數成員

struct A { void f(); }; 
struct B : virtual A {}; 
struct C : virtual A {}; 
struct D : B, C {}; 

我能說什麼?該D有兩個不同的成員函數B::A::fC::B::f它們通過同一個對象調用?或者他們只是同一個成員函數的別名?

例如,對於非虛的情況下,

struct A { void f(); }; 
struct B : A {}; 
struct C : A {}; 
struct D : B, C {}; 

D有兩種不同的成員函數B::A::fC::A::f,因爲他們只是有不同的名稱,因此,呼籲D().f()是一個歧義,因爲我必須指定我想打電話給哪個成員。

但是,在虛擬inhericante的情況下,這不再是必需的,因爲通過一個或另一個路徑調用解決了通過同一個對象調用函數,我不知道在虛擬繼承的情況下,我有兩個不同的成員函數可以解析或在同一個對象上執行,或者它們只是同一個成員函數的別名。

無論如何,從實際的角度來看,差異並不重要,但從更正式的觀點來看,我不知道該說些什麼。

+0

@Bon總之,我不知道有多少成員函數(不考慮默認生成的成員)有D. –

+1

你剛剛重新發現了什麼是虛擬繼承:P – user463035818

回答

2

在虛擬繼承的情況下,您有D::A::f(),並且在兩個中間繼承級別中沒有特定的重寫版本。

D().B::A::f()作品出於同樣的原因,它的作品在此順利的情況下(它繼承父版本):

struct A { void f(); }; 
struct B : A {}; 
struct D : B {}; 
+0

如果是這種情況,如果'D'如何編譯'D()。B :: A :: f有沒有這樣的成員函數? –