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(おそらく、を使用して純粋な仮想にすることを意図して= 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 に答える