Çoğu durumda, soru kendiliğinden sorulmaz; çünkü bazen miras, hangi şablonların sağlayamayacağı gerekli özellikleri sağlar. Örneğin, bir farklı tür (polimorfizm) üzerinden farklı türlere hitap etmem gerektiğinde, kalıtımı kullanmam gerekir. Bununla birlikte, sorunun hem kalıtımla hem de şablonlarla çözülebileceği bazı durumlar vardır.Kalıtım yerine şablonları ne zaman kullanmalıyım?
bir dosya ayrıştırıcıbir çözüm gibi görünebilir:
kodun belirli bölümlerinin örneği stratejisi desen benzeri parametreyle belirtme atın
ParsingAlgorithm soyut bir temel sınıftırclass FileParser
{
//...
public:
void Parse(ParsingAlgorithm* p);
//...
}
void FileParser::Parse(ParsingAlgorithm* p)
{
m_whatevertypeofvaluesineed = p->Parse(whateverparametersyouneed);
}
, FileParser sınıfı için belirli bir ayrıştırıcıyı kullanmayı seven herkesin miras alması gereken bazı temel yöntemler ve gereksinimler sağlar.
Ancak, aynı kolaylıkla elde edilebilir kullanarak şablonlar:
template <class Parser>
class FileParser
{
//...
public:
void Parse()
{
m_whatevertypeofvaluesineed = m_parser.Parse(whateverparametersyouneed);
}
private:
Parser m_parser;
//...
}
Ben şablonlar veya devralma kullanıp kullanmayacağına karar için kullanabileceğiniz bazı genel kurallar var mıdır? Ya da sanal işlevler gibi şeylerin çalışma zamanı yükünü önlemek için mümkün olduğunca şablonları kullanmalı mıyım? miras tarafından sağlanan
çalıştırma polimorfizmi aksine
[Daha fazla tasarım için sanal işlevselliği tamamen değiştirebilir miyim?] [Http://stackoverflow.com/questions/6613779/can-crtp-completely-replace-virtual-functionality-for-smaller-designs) – iammilind