ダウンキャスト or テンプレート
悩ましいことがあります。
#includeusing namespace std; class A1{ public: virtual ~A1(){} }; class A2 : public A1{ public: void f(){cout << "A2" << endl;} }; class B1{ public: A1 *a; B1(A1 *a1){ a = a1; } B1(){} }; class B2 : public B1{ public: B2(A2 *a2){ a = a2; } void printA(){ A2 *a2 = dynamic_cast (a); a2->f(); } }; int main(){ B2 b(new A2); b.printA(); return 0; }
なんのこっちゃだけど、A1と、それをメンバ変数に持つB1というクラスがあって、A1、B1をそれぞれ継承したA2、B2がある。今までA1+B1でやっていたことをA2+B2でやりたいということ。こうすると、A2で新たに実装されたメソッドを使うには、ダウンキャストしなければいけない。RTTIといえども親クラスに名前のないメソッドは実行してくれない。なんかいい手はないものかね。
テンプレート使えば解決はできるけど・・・
#includeusing namespace std; class A1{ public: virtual ~A1(){} }; class A2 : public A1{ public: void f(){cout << "A2" << endl;} }; template class B1{ public: T *a; B1(T *a1){ a = a1; } }; template class B2 : public B1 { public: B2(T *a1) : B1 (a1){} void printA(){ a->f(); } }; int main(){ B2 b(new A2); b.printA(); return 0; }
これが果たしてスマートな解決方法なんだろうか???わからん・・・
デザインパターンとかでいい例はないのかな。デザインパターン全然知らないけど、見てみようかな。