我有这堂课,
class Base {
public:
void foo();
};
int main()
{
Base b;
}
main
将编译没有任何错误,虽然foo()
没有定义。但是b.foo();
会导致编译错误。
此外,即使对于constructor
and operator=
,我也可以只声明它们而不定义它们,只要我不触发它们,它就会编译。
问题
再次,我将一个虚函数添加到Base
,
class Base {
public:
void foo();
virtual void bar(); // no defition is gonna be provided.
};
现在,main
无法编译,而是出现错误:
未定义对 Base 的 vtable 的引用
好吧,这让我有点困惑,因为以前,main
只要foo()
不调用就可以编译,但现在我添加bar()
了它,根本不调用它。
为什么在这种情况下不编译?