この例では、多型のアプリケーションにいくつか問題があります。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を使用して翻訳可能なコードを修正する方法を教えてください。
あなたの好きなC++ブック、FAQ、リファレンスサイトで 'virtual'継承を探します。また、Webで「C++ dreaded diamond inheritance」を検索してください。 –
私はこの問題を知っています...しかし、どのように私の質問に関係がありますか?このコードは正しいですが、MSVS 2010はコンパイルしませんが、g ++ ant oherコンパイラは... – Johnas