C++ Weird Diamond继承问题

标签 c++ visual-c++ inheritance diamond-problem

我有这个

    A
  /   \
 B     C
  \   /
    D

A 有一个纯虚函数,原型(prototype)为:

virtual A* clone(void) const = 0;

B和C实际上继承自A(class B: public virtual A, class C: public virtual A)

B 有虚函数,原型(prototype)为:

virtual B* clone(void) const {}; 

C 有虚函数,原型(prototype)为:

virtual C* clone(void) const {};

D 像这样从 B 和 C 继承:class D: public B, public C D 具有虚函数,原型(prototype)为:

virtual D* clone(void) const {};

现在,编译时出现以下 6 行错误:

error C2250: 'D' : ambiguous inheritance of 'B *A::clone(void) const'

不知道如何解决这个问题。

提前致谢。

最佳答案

如果您只希望在您的层次结构中有一个父拷贝,请​​使用虚拟继承。

class B : public virtual A

编辑:
MSVC++ 2010 中可能存在错误。Intellisense 未检测到问题,但编译器对此进行了阻塞。奇怪,因为 VC6 对此很满意。

作为变通方法,如果您按如下方式声明 D,它会使 MSVC++ 2010 满意,同时在编译器中工作时也不会出现此问题:

class D: public virtual A, public B, public C

关于C++ Weird Diamond继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3592648/

相关文章:

c++ - 在 C : Will alignment break my neck? 中伪造继承

c++ - 显式转换函数、直接初始化和转换构造函数

c++ - 使用/clr 选项编译 C 代码

c++ - 在 C++ 中实现变量约束

c++ - 成员函数 SFINAE 错误 C2938

visual-c++ - Windows 7 用户权限和安全审查

c++ - 为什么两个指针值不相同?

javascript - 在 Javascript 中获取派生构造函数的名称

c++ - 在 C++ 中序列化,在 Python 中反序列化?

c++ - 为什么编译器接受这个删除的 move 构造函数?