Trong nhiều trường hợp, câu hỏi thậm chí không tự hỏi, vì đôi khi thừa kế cung cấp các tính năng cần thiết mà các mẫu không thể cung cấp. Ví dụ, khi tôi cần phải giải quyết các loại khác nhau thông qua một loại cơ sở (đa hình), tôi cần phải sử dụng thừa kế.Khi nào tôi nên sử dụng các mẫu thay vì thừa kế và ngược lại?
Tuy nhiên, có một số trường hợp mà vấn đề có thể được giải quyết cả với thừa kế, cũng như mẫu.
Hãy cho chiến lược ví dụ mô hình giống như parametrization của một số phần của mã:
Một giải pháp của một tập tin-phân tích cú pháp có thể trông như thế này:
class FileParser
{
//...
public:
void Parse(ParsingAlgorithm* p);
//...
}
void FileParser::Parse(ParsingAlgorithm* p)
{
m_whatevertypeofvaluesineed = p->Parse(whateverparametersyouneed);
}
nơi ParsingAlgorithm là một lớp cơ sở trừu tượng, cung cấp một số phương thức cơ bản và cần được kế thừa bởi bất kỳ ai thích thực hiện một trình phân tích cụ thể cho lớp FileParser.
Tuy nhiên, tương tự một cách dễ dàng có thể đạt được bằng mẫu:
template <class Parser>
class FileParser
{
//...
public:
void Parse()
{
m_whatevertypeofvaluesineed = m_parser.Parse(whateverparametersyouneed);
}
private:
Parser m_parser;
//...
}
Có một số quy tắc chung mà tôi có thể sử dụng để quyết định có nên sử dụng các mẫu hoặc thừa kế? Hoặc tôi chỉ nên sử dụng mẫu ở bất kỳ nơi nào có thể, để tránh chi phí thời gian chạy của những thứ như chức năng ảo?
hơi trùng lặp của [Có thể CRTP thay thế hoàn toàn chức năng ảo cho thiết kế nhỏ hơn không?] (Http://stackoverflow.com/questions/6613779/can-crtp-completely-replace-virtual-functionality-for-smaller-designs) – iammilind