在很多情況下,這個問題甚至不會自問,因爲有時繼承會提供模板無法提供的必要功能。例如,當我需要通過一個基類型(多態)解決不同類型時,我需要使用繼承。什麼時候應該使用模板而不是繼承,反之亦然?
但是,有些情況下可以通過繼承和模板來解決問題。
取的代碼的某些部分的示例策略圖案狀的參數化:
文件解析器的的一個解決方案可能看起來像這樣:
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