【问题标题】:C++, ambiguous inheritance error in vs 2010C ++,vs 2010中的模棱两可的继承错误
【发布时间】:2011-08-03 20:44:57
【问题描述】:

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

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++编译此代码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 进行翻译?

【问题讨论】:

  • 在您最喜欢的 C++ 书籍、常见问题解答或参考站点中查找 virtual 继承。还可以在网上搜索“C++ 可怕的钻石继承”。
  • 我知道这个问题......但它与我的问题有什么关系?这段代码是正确的,但是 MSVS 2010 没有编译它但是 g++ ant 其他编译器是的......

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。如果我理解正确,那么该错误将在下一个版本的 VS 中更正...有没有其他方法可以使用 MSVS2010 编译代码(编译器设置...)?
  • 不,该错误已以“不会修复”的形式关闭,这意味着它不会在下一个版本中修复。似乎不可能使用 Visual C++ 来编译将虚拟继承与协变相结合的代码。如果这对您来说是一个重要问题,请转到该 Connect 错误,点赞,单击“N 个用户可以重现此错误”下的“我也可以”按钮,然后发表评论。
  • 这很烦人。我们能期望这个问题有时会得到解决吗?我没有任何向 Microsoft 报告错误的经验...
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2011-06-19
  • 2018-04-05
相关资源
最近更新 更多