C++のお話。
Colladaを読んでいて、daeElement型で取得したポインタを実際の型にダウンキャストしなければならない事態に陥った。陥ったというか設計上やむなしといったところか。いずれにせよ、そういう事態になった。
Colladaでも型情報を文字列で返してくれるなど、親切なAPIは用意されていたのだが、せっかくなのでtypeidを使ってみることにした。
10 | class Sub1: public Base{}; |
11 | class Sub2: public Base{}; |
15 | Base *base = new Base(); |
16 | Base *sub1 = new Sub1(); |
17 | Base *sub2 = new Sub2(); |
19 | if ( typeid (*base) == typeid (Base)) |
21 | cout << "Yeah! I'm an instance of Base!!" << endl; |
24 | if ( typeid (*sub1) == typeid (Sub2)) |
26 | cout << "Hi! I'm an instance of Sub2!!" << endl; |
30 | cout << "Boooo... I'm not an instance of Sub2!!" << endl; |
33 | if ( typeid (*sub2) == typeid (Sub2)) |
35 | cout << "Hi! I'm an instance of Sub2!!" << endl; |
39 | cout << "Boooo... I'm not an instance of Sub2!!" << endl; |
実行結果は以下のとおり。
Yeah! I'm an instance of Base!!
Boooo... I'm not an instance of Sub2!!
Hi! I'm an instance of Sub2!!
実は最初試したときはvirtual関数を一つも書いていなかったので、POD型としてコンパイルされる->実行時型情報がとれないということになっていたっぽい。なので上記コードのvirtualなデストラクタは一見無意味ですが、つくっておかないと望んだ結果は得られません。まあ普通は作るよね…。
strcmpで比較するより短く書け、dynamic_castでいちいち型を調べていくより効率良さそうな方法だと思う。早速取り入れてみよう。
参考サイト
0 件のコメント:
コメントを投稿