0

は、したがって、我々は、古典的なダイヤモンドの問題とint型のソリューションを持って取り扱い:ダイヤモンドの継承、C++は

class A 
{ 
public: 
    A() 
    { 
     std::cout << "A c'tor" << std::endl; 
    } 
    void f() 
    { 
     std::cout << "A::f()" << std::endl; 
    } 
}; 

class B :virtual public A{}; 

class C :virtual public A{}; 

class D : public B, public C{}; 

どのようにコンパイラがこれを処理するので、それが唯一のインスタンスを1つ作成していますか? できるだけ具体的にお答えください。

+1

は、[この](http://www.phpcompiler.org/articles/virtualinheritance.html) –

答えて

2

標準はそれを扱うコンパイラする必要がありますが、通常は(私の知る限りgccMSVC)、それは私は以下のように実装だかが指定されていません。

クラスは通常を継承する場合は、基本クラスのメンバの全てを含むであろう

クラスは、実質、それが(全体ではなくクラスの)そのベースクラスが存在する場所へのポインタを含むことになる、仮想基本クラスを継承する場合ほとんどの派生オブジェクト内に存在しなければならない。

struct A 
{ 
    int i; 
}; 

struct B: virtual A{}; 

struct C: B{}; 



int someFunction() 
{ 
    /* b internally contains pointer that points to it's (virtual)base class , 
    in this case B itself is most derived object so it points to base class 
    which is stored somewhere inside B */ 

    B b; 


    /* now subobject B (which is stored inside C) contains pointer that 
     ,again points to it's (virtual) base class 
     ,but that class now resides in most derived object which is C */ 

    C c; 
} 

余分なポイント:エラーがどこにある

はあなたが把握することはできますか?

struct A 
{ 
    std::string message; 

    A(std::string parameter): message(parameter) {} 

}; 

struct B: virtual A 
{ 
    B(std::string parameter): A(parameter) {} 
}; 

struct C: B 
{ 
    C(){} 
}; 
+0

か "_itは(全体ではなくクラスの)pointer_が含まれています" を見てみましょう。実装の詳細です。すべてのコンパイラが内部ポインタを使用するわけではありません。 – curiousguy

+0

@curiousguyはい、そうです、標準は指定します*何が起こるでしょうか?私は簡単に答えようとしました。私は答えにsom行を追加しました。 – PcAF

+0

内部ポインタの実装が「通常の」、あるいは最も一般的な実装であることを私は確信していません。MSVCのことを知っていますので、バイナリレベルで互換性のあるコードを生成することを意図したコンパイラは、コンパイラはおそらくそれを行います。しかし、それはオブジェクトのいくつかの部屋を無駄にします。 – curiousguy