C++,vs 2010中的模糊继承错误

Joh*_*nas 6 c++ covariance virtual-inheritance visual-c++ visual-c++-2010

在这个例子中我对多态性的应用有些麻烦.这个问题类似于我的上一个问题

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(){}
Run Code Online (Sandbox Code Playgroud)

和两个使用虚拟继承的继承类

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
Run Code Online (Sandbox Code Playgroud)

上面提到的错误只发生在使用MSVS 2010编译器,g ++编译这段代码OK.

类图(简化)

.......... A .... B.....
........../.\..../......
........./...\../.......
......../.....\/........
.......D...... C........
........\...../.........
.........\.../..........
..........\./...........
...........E............
Run Code Online (Sandbox Code Playgroud)

最后讨论结果:从类C中删除copy()方法的声明.

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

C::~C(){}
Run Code Online (Sandbox Code Playgroud)

我使用多态的示例代码需要创建指向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;
}
Run Code Online (Sandbox Code Playgroud)

你能帮帮我,请问如何使用VS 2010纠正可翻译的代码?

Jam*_*lis 8

这是Visual C++中的一个已知错误:

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

您需要消除协方差或虚拟继承.不幸的是,你不能兼得.

  • 不,该错误已关闭为“不会修复”,这意味着它不会在下一个版本中修复。似乎无法使用 Visual C++ 来编译将虚拟继承与协方差相结合的代码。如果这对您来说是一个重要问题,请转到该 Connect 错误,对其进行投票,单击“N 个用户可以重现此错误”下的“我也可以”按钮,然后发表评论。 (2认同)