必须在多级继承中定义纯虚拟

时间:2016-10-28 21:31:10

标签: c++ oop

我有一个mutli级别的层次结构,在顶层有一个抽象基类。在层次结构的中间层实现纯虚拟是没有意义的,但如果没有它,编译就会失败。 请参阅以下示例和嵌入式代码注释。

我得到错误,例如"未定义的引用vtable"或"无法分配,因为函数是纯粹的",具体取决于包含哪些行。 唯一可行的方法是在D1中实现方法setValue,即使它不适用于那里。

我发现了一些类似的帖子,但没有找到任何回答这个特定案例的帖子。你可以说,我是C ++ / OOP的新手。

感谢您一看。

<div class="header"></div>

2 个答案:

答案 0 :(得分:0)

您必须提供可能出现在具体类级别的所有虚拟纯方法的实现 - 使用new或变量定义调用构造函数 - 。

如果您未在void setValue(int value) { }级别提供D1且错误为

,则属于这种情况
  

&#34;无法分配,因为功能是纯粹的&#34;

如果您不想提供D1::setValue,则应提供默认值 虚拟void AB::setValue(int value) {}的实现。错误

  

&#34;未定义对vtable&#34;

的引用

来自缺少的实现。您已声明void AB::setValue(int value);,但尚未提供任何实现。由于它是一个虚方法,链接器会抱怨此消息。

答案 1 :(得分:0)

AB* pD1= new D1;

构造一个D1。为了使D1可构造,它必须实现其基类保持纯粹的一切。

virtual void setName(std::string s) = 0; // implemented by D1
virtual void setValue(int value) = 0; // not implemented by D1

D1没有实现setValue,这是不完整的。

解决方案:如果您希望D1的实例和AB的用户能够使用setValue,请实施setValue。没有其他选择。如果AB的用户永远不会使用setValue,请将其从AB中删除。不要抽象或揭露你不会使用的东西。

非主题推荐:

即使它们什么都不做,也要实现析构函数。默认析构函数不是虚拟的,这将导致问题,确保销毁正确的子对象而不是基类。