ジェネリック プログラミングと、仮想関数とテンプレートを一緒に使用してはいけない方法に関する記事をいくつか見たことがあります。テンプレートはコンパイル時に決定され、仮想関数は実行時まで選択されないため(単純化されているため)、このイディオムを理解しています。
ただし、OO スタイルと Generic スタイルを一緒に使用するコードが少しあり、希望どおりに動作するようです。
私の質問:
次の設計の悪い習慣です。ポリモーフィズムと汎用コードの混合?
以下の私のコードに落とし穴はありますか?(データ メンバーを継承すべきではないことはわかっていますが、:-/ があります)。
#ifndef BaseTemplate_H
#define BaseTemplate_H
#include <vector>
template< class T >
class BaseTemplate {
public:
typedef std::vector<T*> pVT;
BaseTemplate(){}
virtual ~BaseTemplate(){};
virtual void Process()=0;
const pVT& getContainer(){ return m_pContainer; }
protected:
pVT m_pContainer;
private:
BaseTemplate( const BaseTemplate& cpy );
BaseTemplate& operator=( const BaseTemplate& rhs);
};
#endif
継承するときにどのタイプが必要かを基本テンプレートに伝えることで、最初に基本クラスから継承します。これにより、複数の型に対して 2 つの継承が可能になります。これは、設計で分けておきたいものです。
#ifndef DerClassA_H
#define DerClassA_H
#include <iostream>
#include "BaseTemplate.h"
class DerClassA: public BaseTemplate<int> {
public:
DerClassA(){}
virtual ~DerClassA(){}
virtual void Process(){
std::cout << "HELLO I AM: DerClassA" << std::endl;
}//This will push_back objects to m_pContainer
private:
DerClassA( const DerClassA& cpy );
DerClassA& operator=( const DerClassA& rhs);
};
#endif
#ifndef DerClassB_H
#define DerClassB_H
#include <iostream>
#include "DerClassA.h"
class DerClassB: public DerClassA {
public:
DerClassB(){}
virtual ~DerClassB(){}
virtual void Process(){
std::cout << "HELLO I AM: DerClassB" << std::endl;
}//This will push_back objects to m_pContainer
private:
DerClassB( const DerClassB& cpy );
DerClassB& operator=( const DerClassB& rhs);
};
#endif
#include "DerClassA.h"
#include "DerClassB.h"
int main()
{
BaseTemplate<int> *pClassA = new DerClassA();
pClassA->Process();
DerClassA *pClassB = new DerClassB();
pClassB->Process();
delete pClassA;
delete pClassB;
return 0;
}