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

标签 c++ visual-c++ covariance visual-c++-2010 virtual-inheritance

我在这个例子中对多态性的应用遇到了一些麻烦。这个问题和我上一个问题类似

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

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

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

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 的指针 vector 。删除一些元素后我想创建它的拷贝...我需要在类 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++ 中的一个已知错误:

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

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

关于C++,vs 2010 中的模糊继承错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933061/

相关文章:

c++ - 链接器提示找不到现有方法 (C++)

c++ - 如何在 C++ 中使用来自 dll 的结构?

c# - 分配给 Lazy<> 时的反协方差问题

c# - 为什么要限制在泛型类型中的接口(interface)?

c++ - 返回开关的三元运算符

c++ - 构造函数导致 "use of deleted function"错误

c++ - 用于构造 C++ 程序以确定范围的作业 Build 中的错误

c++ - 当 setter 方法参数是 C++ 中的引用时会发生什么?

c++ - CT与MRI读数

c# - Autofac:使用 in 和 out 类型参数解析变体类型