gpt4 book ai didi

c++ - 什么时候应该使用模板而不是继承,反之亦然?

转载 作者:IT老高 更新时间:2023-10-28 22:12:34 25 4
gpt4 key购买 nike

在许多情况下,这个问题甚至不会问自己,因为有时继承提供了模板无法提供的必要功能。例如,当我需要通过一种基类型(多态)来处理不同的类型时,我需要使用继承。

但是,在某些情况下,问题可以通过继承和模板来解决。

以代码某些部分的类似策略模式的参数化为例:

文件解析器的一个解决方案可能如下所示:

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++ - 什么时候应该使用模板而不是继承,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6663666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com