class A
{
public:
A(){}
virtual void func();
};
class B:public A
{
void func(){}
}
如果未实现func
,则在定义A
的一个对象时会出现链接错误。所以为什么?我还没有打func
。
答案 0 :(得分:6)
如果未实现func,则在定义A的一个对象时会出现链接错误。为什么?
因为该标准说必须在这种情况下定义功能(强调我的意思):
[class.virtual]
在类中声明的虚函数必须被定义,或在该类中声明为纯函数[[class.abstract]),或两者都定义;无需诊断([basic.def.odr])。
由于对非纯虚函数的定义不符合标准,因此该标准不需要工具链成功生成可执行文件。
如果链接程序能够诊断缺少的定义,那么您可以认为自己很幸运,因为该诊断不是标准的强制要求。如果消息含糊不清,那么,没有强制执行诊断的原因是有原因的。对于链接器来说,找出源中断的原因并不容易。
答案 1 :(得分:1)
必须实现虚拟功能,除非它是纯虚拟功能。