ISO C ++标准规定必须定义非纯虚拟类的所有虚拟方法。
简单地说,规则是:
如果派生类覆盖了基类虚方法,则它也应提供一个定义;否则,基类应提供该方法的定义。
按照代码示例中的上述规则,virtual void bar();
需要在Base类中进行定义。
参考:
C ++ 03标准:10.3虚函数[class.virtual]
必须定义在一个类中声明的虚函数,或在该类中声明为纯(10.4),或两者都声明。但不需要诊断(3.2)。
因此,您应该使函数成为纯虚函数,或者为其提供定义。
在gcc的常见问题doccuments它还有:
ISO C ++标准规定,必须定义非纯虚拟类的所有虚拟方法,但对于违反此规则不需要任何诊断[class.virtual]/8
。基于此假设,GCC将仅在隐式定义的构造函数,赋值运算符,析构函数和定义其第一个此类非内联方法的转换单元中的类的虚拟表中发出该类。
因此,如果您未能定义此特定方法,则链接器可能会抱怨缺少针对显然不相关的符号的定义。不幸的是,为了改善此错误消息,可能有必要更改链接器,但并非总是如此。
解决方案是确保定义了所有非纯虚拟方法。请注意,即使已将析构函数声明为pure-virtual,也必须对其进行定义[class.dtor]/7
。