我有一个mutli级别的层次结构,在顶层有一个抽象基类。在层次结构的中间层实现纯虚拟是没有意义的,但如果没有它,编译就会失败。 请参阅以下示例和嵌入式代码注释。
我得到错误,例如"未定义的引用vtable"或"无法分配,因为函数是纯粹的",具体取决于包含哪些行。 唯一可行的方法是在D1中实现方法setValue,即使它不适用于那里。
我发现了一些类似的帖子,但没有找到任何回答这个特定案例的帖子。你可以说,我是C ++ / OOP的新手。
感谢您一看。
<div class="header"></div>
答案 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
中删除。不要抽象或揭露你不会使用的东西。
非主题推荐:
即使它们什么都不做,也要实现析构函数。默认析构函数不是虚拟的,这将导致问题,确保销毁正确的子对象而不是基类。