为什么链接器在虚拟情况下给出错误但在非虚拟情况下却没有?

Pal*_*han 3 c++ virtual inheritance

当我有这样的事情:

class A
{
  virtual void rat();
};

class B : public A
{
  virtual void rat() { ; } //implemented!
};

int main(int argc, char **argv)
{
  A *a = new B;
  delete a;
}
Run Code Online (Sandbox Code Playgroud)

我收到链接器错误:

除非我让基础老鼠变成纯粹的虚拟.

但是,当我有这个:

class A
{
  public:
  void rat();
};

int main(int argc, char **argv)
{
  A a;
}
Run Code Online (Sandbox Code Playgroud)

这编译很好,并没有给我一个未定义的引用链接错误,除非我明确尝试在我的main(a.rat();)中调用鼠函数.未实现的基类虚函数的规则是什么,然而,如在第一个失败的代码片段中那样在派生类中实现?

das*_*ght 5

当两个类定义虚拟函数,C++编译器需要建立的vtables两个类AB.要构建Avtable,编译器需要A::rat()- 这就是引用的来源.

如果A没有虚函数,则无法A::rat从任何地方引用,因此您不会收到编译错误.

我确定你知道,你可以通过制作A::rat一个纯虚拟来修复这个错误,从而为vtable提供所需的值(在这种情况下,值为零).