C++奇怪的钻石继承问题

sno*_*kin 3 c++ inheritance visual-c++ diamond-problem

我有这个

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

A具有纯虚函数,原型如下:

virtual A* clone(void) const = 0;
Run Code Online (Sandbox Code Playgroud)

B和C几乎继承自A(class B: public virtual A,class C: public virtual A)

B具有虚函数,原型为:

virtual B* clone(void) const {}; 
Run Code Online (Sandbox Code Playgroud)

C具有虚函数,原型为:

virtual C* clone(void) const {};
Run Code Online (Sandbox Code Playgroud)

D继承了B&C,如:class D: public B, public C D具有虚函数,原型为:

virtual D* clone(void) const {};
Run Code Online (Sandbox Code Playgroud)

现在,在编译时我得到以下6行错误:

error C2250: 'D' : ambiguous inheritance of 'B *A::clone(void) const'
Run Code Online (Sandbox Code Playgroud)

毫无疑问如何解决这个问题.

提前致谢.

Gun*_*r47 9

如果只需要层次结构中父项的一个副本,请使用虚拟继承.

class B : public virtual A
Run Code Online (Sandbox Code Playgroud)

编辑:
MSVC++ 2010中可能存在错误.Intellisense没有检测到问题,但编译器会对其进行扼流.奇怪,因为VC6很开心.

作为一种解决方法,如果您按如下方式声明D,它会使MSVC++ 2010感到高兴,同时也可以在没有此问题的编译器中工作:

class D: public virtual A, public B, public C
Run Code Online (Sandbox Code Playgroud)

  • 但这正是OP已经在做的事情. (2认同)

AnT*_*AnT 5

您在原始帖子中描述的内容完全合法.一个快速的示例代码,完全可以编译而没有Comeau Online编译器的任何错误

class A {
public: virtual A* clone() const = 0;
};

class B: public virtual A {
public: virtual B* clone() const { return 0; }
};

class C: public virtual A {
public: virtual C* clone() const { return 0; }
};

class D: public B, public C
{
public: virtual D* clone() const { return 0; }
};
Run Code Online (Sandbox Code Playgroud)

要么你没有做你说你正在做的事情,要么你的编译器坏了.发布您尝试编译的真实代码.

PS我刚试过在VS 2010 Express中编译它并得到了同样的错误.正如Gunslinger47在评论中所暗示的那样,这是VS 2010编译器中的一个错误.