単純化した設計では、クラス B はクラス A をポリモーフィックに継承します。テンプレート化されたクラスにBase<T>
は、以降のT*
操作に使用されるメンバーがあります。Aは からポリモーフィックにDerived<T>
継承されます。Base<T>
この種のオブジェクトの作成を可能にする構文は次のとおりです。
Base<A>* a = new Derived<B>();
さらに参考までに、私が使用したコードは次のようになります (もちろん、変換は成功しません)。
class A
{
public:
A()
{
cout<< " A ";
}
virtual void one()
{
cout<<" 1 ";
}
};
class B: public A
{
public:
B()
{
cout << " B ";
}
void one()
{
cout << " 2 ";
}
};
template <class T>
class Base
{
public:
T* thing;
Base()
{
cout<<"Base";
thing = new T;
}
template <class S>
Base(Base<S>* obj)
{
thing = obj->thing;
}
virtual void poly(){ thing->one();}
};
template <class T>
class Derived : public Base<T>
{
public:
Derived()
{
cout << "DERIVED ";
}
virtual void poly(){
};
int main(int argc, char** argv)
{
//Base<A>* a = (new Derived<B>());
return 0;
}
コードを簡潔にするために、仮想デストラクタと適切なメモリ管理は意図的に省略されています。
EDIT : この構築の唯一の目的は、たとえば、BaseTemplated<BasePolymorphic>*
ポインターのリストをまとめて保持することであり、基本のポリモーフィック クラスのすべての N サブクラスに使用BaseTemplated<Derived1>
することではありません。BaseTemplated<DerivedN>