2017-08-29 7 views
0

のは、次のコードスニペットを考えてみましょう:仮想継承と機能メンバー

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

は、私が何を言うことができますか? Dには同じオブジェクト上で呼び出される2つの異なるメンバ関数B::A::fC::B::fがありますか?またはそれらは同じメンバ関数の単なるエイリアスですか?

は例えば、非仮想の場合のために、

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

Dは私がするように指定する必要があるためD().f()が曖昧で呼び出し、彼らは別の名前を持っているので、二つの異なるメンバ関数B::A::fC::A::fを持っているので、どのメンバーに電話したいのですか?

しかし、仮想のinhericanteのケースでは、1つのパスまたは別の呼び出しで呼び出して同じオブジェクト上で関数を呼び出すことが解決され、仮想継承の場合、私は2つの異なるメンバ関数を持っています。これらのメンバ関数は同じオブジェクト上で解決されたり実行されたり、同じメンバ関数のエイリアスです。

とにかく、実用的な観点からは違いは問題ではありませんが、より正式な視点からは、私は何を言いたいのか分かりません。

+0

@Bon、私は知らないどのように多くの機能のメンバー(デフォルトを考慮せずD :: B :: A :: f() 'がコンパイルされていても、' D'がコンパイルされていれば、どのようにコンパイルされますか?D –

+1

あなたは仮想継承が良いものを再発見しました:P – user463035818

答えて

2

仮想継承のケースでは、D::A::f()があり、2つの中間継承レベルに特定のオーバーライドされたバージョンはありません。それは、この単純なケースで働くのと同じ理由で

D().B::A::f()作品(それは親バージョンを継承):要するに

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

そのようなメンバ関数はありませんか? –