1
#include <stdio.h>

class A {
public:
  virtual void print();
  A();
};

class B :public A {
public:
  void print();
  B();
};

class C :public B {
public:
  void print();
  C();
};

A::A(){
}

B::B(){
}

C::C(){
}

void B::print() {
  printf("From B\n");
}

void C::print() {
  printf("From C\n");
}

int main() {
  B* object = new C;
  object->print();

  return 0;
}

当我尝试编译此 C++ 文件时,出现以下错误。想不通原因。我尝试阅读关于 SO 的类似未定义 vtable 问题。

/tmp/ccpOkVJb.o: In function `A::A()':
test1.cpp:(.text+0xf): undefined reference to `vtable for A'
/tmp/ccpOkVJb.o:(.rodata._ZTI1B[_ZTI1B]+0x10): undefined reference to `typeinfo for A'
collect2: error: ld returned 1 exit status
4

3 回答 3

7

如果A::print()不打算实现,请将其声明为纯:

class A {
public:
  virtual void print() = 0;
  A();
};

否则,执行它。

于 2012-09-06T21:16:56.223 回答
3

您声明应该有一个A::print实现的方法(您可能打算使其成为纯虚拟 using = 0),但您没有实现它。

由于第一个实现的虚方法使编译器实例化了 vtable 并且您没有在 A 中实现任何内容,因此 A 的 vtable 丢失了,导致undefined reference to 'vtable for A'.

于 2012-09-06T21:18:29.193 回答
2

您需要声明A::print()为纯虚拟,或提供实现:

class A {
public:
  virtual void print()=0;
  A();
};

或者

class A {
public:
  virtual void print() {}
  A();
};
于 2012-09-06T21:18:00.113 回答