当我有这样的事情时:

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;
}

我收到链接器错误:

除非我把基础老鼠变成纯虚拟的。

但是,当我有这个时:
class A
{
  public:
  void rat();
};

int main(int argc, char **argv)
{
  A a;
}

这编译得很好并且不会给我一个 undefined reference 链接错误,除非我明确地尝试在我的 main ( a.rat(); ) 中调用 rat 函数。但是,在派生类中实现的未实现的基类虚函数的规则是什么,如第一个失败的代码片段?

最佳答案

当两个类都定义了虚函数时,C++ 编译器需要为 AB 两个类构建 vtables 。要构建 A 的 vtable,编译器需要 A::rat() - 这是引用的来源。

A 没有虚函数时,任何地方都没有对 A::rat 的引用,因此不会出现编译错误。

我相信您知道,您可以通过将 A::rat 设为纯虚拟来修复此错误,从而为 vtable 提供所需的值(在本例中,该值为零)。

关于c++ - 为什么链接器在虚拟情况下给我一个错误而不是在非虚拟情况下?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10455131/

10-11 02:10