多くの状況では、テンプレートは提供できない必須の機能を継承していることがあるので、質問自体は尋ねません。たとえば、1つの基本型(多型性)で異なる型を扱う必要がある場合、継承を使用する必要があります。継承の代わりにテンプレートを使用するのはいつですか?
しかし、問題は継承とテンプレートの両方で解決できる場合があります。
コードの特定の部分の例戦略パターンのようなパラメータ化のために取る:ファイルパーサーの
一つの解決策は、次のようになります。
class FileParser
{
//...
public:
void Parse(ParsingAlgorithm* p);
//...
}
void FileParser::Parse(ParsingAlgorithm* p)
{
m_whatevertypeofvaluesineed = p->Parse(whateverparametersyouneed);
}
ParsingAlgorithmは、抽象基底クラスであり、いくつかの基本的なメソッドを提供し、FileParserクラス用の特定のパーサーを実装するのが好きな人が継承する必要があります。
しかし、同じことが簡単にテンプレートを使用して達成することができます。
template <class Parser>
class FileParser
{
//...
public:
void Parse()
{
m_whatevertypeofvaluesineed = m_parser.Parse(whateverparametersyouneed);
}
private:
Parser m_parser;
//...
}
は、私は、テンプレートや継承を使用するかどうかを決定するために使用できるいくつかの一般的なルールはありますか?あるいは、仮想関数などの実行時のオーバーヘッドを避けるために、可能な限りテンプレートを使用するだけですか?継承によって提供さ実行時ポリモーフィズムとは対照的に、
[CRTPは小さなデザインでは仮想機能を完全に置き換えることができますか?](http://stackoverflow.com/questions/6613779/can-crtp-completely-replace-virtual-functionality-for-smaller-designs) – iammilind