7

この例では、ポリモーフィズムの適用に問題があります。この質問は私の最後の質問に似ています

C++、仮想継承、奇妙な抽象クラス + クローンの問題

3 つの抽象クラスがあります。

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

上記のエラーは MSVS 2010 コンパイラを使用した場合にのみ発生し、g++ はこのコードを正常にコンパイルします。

クラス図(簡略)

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

最後に、クラス C から copy() メソッドの宣言を削除します。

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

C::~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 を使用して翻訳可能になるようにコードを修正する方法を教えてください。

4

1 に答える 1

7

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

仮想継承で共分散を使用すると、Visual C++ があいまいさを誤って報告する

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

于 2011-08-03T20:53:43.863 に答える