2012-04-10 20 views
1

私は、C++の仮想派生におけるあいまいさのいろいろな状況を学んでいます。仮想派生と曖昧な変換

class V { 
    public: 
     int v ; 
}; 

class A { 
    public: 
     int a ; 
}; 

class B : public A, public virtual V { 

}; 

class C : public A, public virtual V { 

}; 

class D : public B, public C { 
    public: 
     void f() ; 
}; 

void g() { 
    D d ; 
    B* pb = &d ; // No Problem 
    A* pa = &d ; // Error: 'A' is ambiguous base of 'D' 
    V* pv = &d ; // No Problem 
} 

私が持っていない理由を私は理解していない:

はここに私のコードです しかし、私は私のコードではあいまいの誤差を持っていると私はそれが理由です理解していません...このエラーは、私は他の影響のためのエラーはありません。

は、これが完全にmultiple inheritanceの場合に期待されている:-)

答えて

2

ありがとうございます。私たちがここにいるのは、ダイヤモンドの継承の場合です。 DにはAの2つのコピーがあり、Bから継承したものとCから継承したものがあります.Dに公開されているAのメンバーが来るBまたはCを指定する必要があります。

参照:Using C++, how do I correctly inherit from the same base class twice?

は、あなたが考えるかもしれない:

  • を仮想継承を使用する:

    compositioを使用して

    class B : public virtual A, public virtual V {...};

    class C : public virtual A, public virtual V {...};

  • 複数の継承からの抜け道としてのn。

私はSolving the Diamond Problem with Virtual Inheritance

+1

ありがとうを読んで示唆しています。しかし、どちらもAから継承されています。だから、この影響の問題は何ですか?ありがとう – Copernic

+0

@Mehdi - D *はAの2つのインスタンスを継承することはできません。それについて考える - Aにパブリックプロパティ "a"が含まれる場合、BとCはそれぞれプロパティ "a"を持ちます。現在、Dには2つのプロパティ "a"があります - コンパイラはどちらを使うべきですか?それをマージするだけでは簡単ではありません。それがコンパイルできない理由です。 – Alain

+0

Aaah。今分かります !! ありがとうございます@Alain :) – Copernic

関連する問題