ダウンキャスト or テンプレート

悩ましいことがあります。

#include 
using 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といえども親クラスに名前のないメソッドは実行してくれない。なんかいい手はないものかね。

テンプレート使えば解決はできるけど・・・

#include 
using 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;
}

これが果たしてスマートな解決方法なんだろうか???わからん・・・
デザインパターンとかでいい例はないのかな。デザインパターン全然知らないけど、見てみようかな。