今日もg++に完敗

下記のようなコード

#include <iostream>

class A {
public:
  A() {};
  virtual ~A() {};
  virtual void hoge();
};

class B : public A {
public:
  B() {}
  ~B() {}
  
  void hoge();
};

void B::hoge() {}

int main(int argc, char** argv)
{
  A* a = new B();
  
  return 0;
}

をコンパイルすると、次のようなリンクのエラーが出る。

Undefined symbols:
"typeinfo for A", referenced from:
typeinfo for Bin cc8qkzDW.o
"vtable for A", referenced from:
A::A() in cc8qkzDW.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

あぁ、コンストラクタの実装を忘れたんだね、と思ってソースを見ていると、とりあえず実装している。

あぁ、基底クラスのデストラクタにvirtual指定忘れたのかな、と思ってソースを見ると、ちゃんと付いている。

あれ、何が原因やねん? と悩むこと30分。void A::hoge()を実装していないか、もしくは、純粋仮想関数にしてなかったのね、と気づく。

今日も一日g++のツンデレっぷりにやられました。