W wielu sytuacjach pytanie nawet nie zadaje sobie pytania, ponieważ czasami dziedziczenie zapewnia niezbędne funkcje, których szablony nie mogą dostarczyć. Na przykład, kiedy potrzebuję adresować różne typy przez jeden typ podstawowy (polimorfizm), muszę użyć dziedziczenia.Kiedy należy używać szablonów zamiast dziedziczenia i na odwrót?
Istnieje jednak kilka przypadków, w których problem można rozwiązać zarówno w dziedziczeniu, jak i szablonach.
Weźmy na przykład strategii wzór podobny parametryzacji niektórych częściach kodu:
Jedno rozwiązanie pliku-parser może wyglądać następująco:
class FileParser
{
//...
public:
void Parse(ParsingAlgorithm* p);
//...
}
void FileParser::Parse(ParsingAlgorithm* p)
{
m_whatevertypeofvaluesineed = p->Parse(whateverparametersyouneed);
}
gdzie ParsingAlgorithm jest abstrakcyjną klasą bazową, która zapewnia pewne podstawowe metody i musi być dziedziczona przez każdego, kto lubi zaimplementować określony parser dla klasy FileParser.
Jednak samo można łatwo uzyskać stosując szablony:
template <class Parser>
class FileParser
{
//...
public:
void Parse()
{
m_whatevertypeofvaluesineed = m_parser.Parse(whateverparametersyouneed);
}
private:
Parser m_parser;
//...
}
istnieją pewne ogólne zasady, które można użyć, aby zdecydować, czy używać szablonów lub dziedziczenia? Czy powinienem po prostu używać szablonów wszędzie tam, gdzie to możliwe, aby uniknąć nakładu czasu związanego z funkcjami wirtualnymi?
Nieco duplikat [Czy CRTP całkowicie zastępuje funkcje wirtualne dla mniejszych projektów?] (Http://stackoverflow.com/questions/6613779/can-crtp-completely-replace-virtual-functionality-for-smaller-designs) – iammilind