Sunday, 20 December 2009

3000時間と C++ pure virtual



まだ、時計を飼ってたりするんですが、なんか、3000時間になってました。125日か。別にどうってことはないんですが。

昨日は、楽勝でカレーが食べられるペースで学生のプログラムの面倒を見てたんですが... 最後に、C++ の Pure virtual class ではまりました。

最近のオブジェクト指向言語では、Interface/Abstract Class は必須なんだけど、C++ には、Interface はない...

で、virtual function ってのを使うわけなんだけど、これは、vtable っていう隠れたテーブル上から検索される。別に、Hoge.h に virtual void hoge(); って書いて、これを class Haga : public Hoge とかく。

なんだが、まず、

  virtual を継承するなら、Haga の virtual destructor を書け

と言ってくる。まぁ、それは書けば良いんだが、そうすると、リンカが、

  Z12TVHoge undefined

とか言ってくる。謎過ぎなんだよ... これは、mangling とか言って、型をencode したシンボルんだよね。これで、同じ名前でも型が違う関数(Polymorphism)を実装している。

経験的に、これはconstructorだってのはわかっているので、Hoge.h に、

  Hoge() {}

とか書くんだが、全然、直りません。nm とか追うんだが、Haga から Hoge() を呼んでいるっぽいが、Hoge() が定義されてない。定義されるとすれば、Hoge.o か。そういえば、Hoge.cc って書いてないし。Hoge.h だけじゃだめなのか? pure virtual なのに? ってわけで、

  Hoge.cc に、Hoge() {}

と書く。すると、Duplicate と言われるので、Hoge.h の Hoge() {} は、Hoge(); に直す。はぁ。

そうすると、今度は、

  ZV12THogeVhoge undefined

とか言ってくる。あー、もう、いったいなんなんだ。nm すると、HagaVhoge とかはある。あ、そうか。Hoge.h に、

  virutal hoge() = 0;

て書くらしい。そんなのエラーメッセージからは、わかんねよ。

要するに、C++ では、Pure virutal class は使っちゃだめで、実装のある class を 中途半端に継承しろってことらしいです。

おかげでカレーを食べ損なって、我流に行って来ました。

  龍麺伝説 我流家 - てだこラーメンデータベース http://bit.ly/79D1Sp

No comments: