以下のような形のソースコードをdynamic_castを使わずに実行したいのですが、上手く行きません。何か方法はないのでしょうか?
C++
1 2class Foo 3{ 4 Foo(); 5 virtual void bar()=0; 6} 7class Foo_A 8{ 9 Foo_A(); 10 virtual void bar(); 11 double baz(); 12} 13 14class Foo_B 15{ 16 Foo_B(); 17 virtual void bar(); 18 int qux(int num); 19} 20 21//関数の実装は省略 22 23int main() 24{ 25 Foo* arr[100]; 26 for(int i=0;i < 100;i++) 27 { 28 //random()は乱数を呼ぶ関数 29 if(random()%2 == 1) 30 { 31 arr[i] = new Foo_A(); 32 } 33 else 34 { 35 arr[i] = new Foo_B(); 36 } 37 } 38 39 Foo_A* foo_a; 40 Foo_B* foo_b 41 42 //この部分でdynamic_castを使用してしまう 43 for(int i=0;i<100;i++) 44 { 45 foo_a=dynamic_cast<Foo_A*>(vec[i]); 46 foo_b=dynamic_cast<Foo_B*>(vec[i]); 47 //random()は乱数を呼ぶ関数 48 if(foo_a!=nullptr) 49 { 50 arr[i].baz(); 51 } 52 else if(foo_b!=nullptr) 53 { 54 arr[i].qux(10); 55 } 56 } 57 //メモリの解放は省略 58} 59
このようにdynamic_castを使って遅いソースコードになってしまいます。dynamic_castやダウンキャストは余り使用したくありません。
本来ならば動的ポリモーフィズム等を駆使してint qux(int num)とdouble baz()を一つの純粋仮想関数にし、派生先で実際の動作を別々に実装するべきなのでしょうが、実際のコードではどうしても戻り値と引数が異なる形になってしまい、上手くまとめる事が出来ません。
このような問題に対してはdynamic_castを使って実装をするしか手はないのでしょうか?それとも何か別の方法があるのでしょうか?よろしくお願いします。

回答6件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/02 22:03