visual c++在vs 2010中出现了模糊继承错误

visual C++, ambiguous inheritance error in vs 2010

本文关键字:模糊 继承 错误 c++ vs 2010 visual      更新时间:2023-10-16

我在这个例子中使用多态性有一些问题。这个问题和我上一个问题很相似

c++,虚拟继承,奇怪抽象类+克隆问题

有三个抽象类:

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(){}

和两个使用虚拟继承

的继承类
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++编译此代码OK。

类图(简化)

.......... 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?

这是Visual c++中一个已知的bug:

Visual c++在协方差与虚拟继承一起使用时错误地报告歧义

您要么需要消除协方差,要么需要消除虚拟继承。不幸的是,你不能两者兼得。