6

この例では、多型のアプリケーションにいくつか問題があります。C++、2010年のあいまいな継承エラー

class A 
{ 
public: 
    virtual A * copy() const = 0; 
    virtual ~A() = 0; 
}; 

A::~A(){} 

class B 
{ 
public: 
    virtual B * copy() const = 0; 
    virtual ~B() = 0; 
}; 

B::~B(){} 

class C: virtual public A , public B 
{ 
public: 
    virtual C * copy() const = 0; 
    virtual ~C() = 0; 
}; 

C::~C(){} 

と2つの継承したクラス

class D: virtual public A 
{ 
public: 
    virtual D * copy() const {return new D (*this);} 
    virtual ~D() {} 
}; 

class E: virtual public D , public C 
{ 
public: 
    virtual E * copy() const {return new E (*this);} 
    virtual ~E() {} 
}; //Error C2250: 'E' : ambiguous inheritance of 'D *A::copy(void) const 

は、上記のエラーが発生した仮想継承を使用して:この質問は3つの、抽象クラスがあり

C++, virtual inheritance, strange abstract class + clone problem

私の最後の質問に似ていますMSVS 2010コンパイラのみを使用して、g ++はこのコードをコンパイルしても問題ありません。

クラス図(簡体字)

.......... A .... B..... 
........../.\..../...... 
........./...\../....... 
......../.....\/........ 
.......D...... C........ 
........\...../......... 
.........\.../.......... 
..........\./........... 
...........E............ 

我々は結果を閉じる最後の議論:多型のニーズを使用して私のサンプルコード、クラスCから

class C: virtual public A , public B 
{ 
public: 
    //virtual C * copy() const = 0; //remove declaration 
    virtual ~C() = 0; 
}; 

C::~C(){} 

をコピー()メソッドの宣言を削除いくつかの要素を削除した後、コピーを作成したい...クラスCでcopy()宣言が必要なので、宣言の削除が不十分で問題を解決できません。

int main(int argc, char* argv[]) 
{ 
std::vector <C*> items; 
items.push_back(new E()); 
items.push_back(new E()); 
items[0]->copy(); 
return 0; 
} 

VS 2010を使用して翻訳可能なコードを修正する方法を教えてください。

+1

あなたの好きなC++ブック、FAQ、リファレンスサイトで 'virtual'継承を探します。また、Webで「C++ dreaded diamond inheritance」を検索してください。 –

+0

私はこの問題を知っています...しかし、どのように私の質問に関係がありますか?このコードは正しいですが、MSVS 2010はコンパイルしませんが、g ++ ant oherコンパイラは... – Johnas

答えて

7

これは、Visual C++での既知のバグです:

Visual C++ incorrectly reports ambiguity when covariance is used with virtual inheritance

はあなたのいずれかが、共分散または仮想継承を排除する必要があります。残念ながら、あなたは両方を持つことはできません。

+0

あなたの答えをありがとう。私が正しく理解しているので、次のリリースVSでエラーが修正されます... MSVS2010(コンパイラ設定...)を使用してコードをコンパイルする方法は他にありますか? – Johnas

+1

いいえ、バグは「修正されません」と表示され、次のリリースでは修正されません。 Visual C++を使用して、仮想継承と共分散を組み合わせたコードをコンパイルすることはできないようです。これがあなたにとって重要な問題であれば、接続バグに行き、upvote、 "Nユーザーがこのバグを再現できる"の下にある "I can too"ボタンをクリックし、コメントを残してください。 –

+0

迷惑です。この問題は時々修正されることが予想されますか?私はMicrosoftにバグ報告の経験がありません... – Johnas