【发布时间】:2011-10-03 13:38:24
【问题描述】:
在许多情况下,这个问题甚至不会问自己,因为有时继承提供了模板无法提供的必要功能。例如,当我需要通过一种基类型(多态)来处理不同的类型时,我需要使用继承。
但是,在某些情况下,问题可以通过继承和模板来解决。
以代码某些部分的类似策略模式的参数化为例:
文件解析器的一个解决方案可能如下所示:
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;
//...
}
是否有一些通用规则可以用来决定是使用模板还是继承?或者我应该尽可能简单地使用模板,以避免像虚拟函数这样的运行时开销?
【问题讨论】:
标签: c++ templates inheritance