gpt4 book ai didi

c++ - 模板和多态有什么区别

转载 作者:IT老高 更新时间:2023-10-28 23:16:42 26 4
gpt4 key购买 nike

大家好,我对模板和多态性有疑问。根据定义,多态性提供了代码可重用性,而模板在某种意义上允许用户通过提供具有不同数据类型的泛型编程来使用相同的代码。那么在模板上使用多态有什么好处呢?这可能是一个愚蠢的问题,但我很想知道确切的区别。

最佳答案

你似乎误解了什么是多态性。

多态本质上与派生类无关。多态只是意味着在不了解类型的情况下使用类型的能力。多态不是使用具体的类型,而是依赖某种形式的原型(prototype)来定义它需要什么类型。接受适合该原型(prototype)的任何类型。

在 C++ 中,运行时多态是通过从包含虚函数的基类派生类来提供的。基类和虚函数构成了多态原型(prototype)。为接受调用这些虚函数的基类而编写的代码将接受从基类派生的任何类实例。

编译时多态是在编译时发生的多态性 ;) 这意味着编译器必须知道发生了什么。您可能已经针对多态原型(prototype)编写了 C++ 代码,但编译器并不关心。您会在编译后获得特定的具体类型。

编译时多态性由 C++ 中的模板提供。模板函数或类可以采用任何符合原型(prototype)的类型,通常称为“概念”。与基类和虚函数不同,原型(prototype)是隐式的:原型(prototype)仅由模板函数/类如何使用类型来定义。

如果你有这个模板功能:

template<typename T>
void Stuff(T &t)
{
t.call(15);
}
T 上有一个隐含的要求.这个要求是它有一个名为 call的成员函数。 .此成员函数必须有一个可以用整数值调用的重载。

这意味着可以使用恰好适合此原型(prototype)的任何类型。

模板多态比继承多态更广泛,因为它可以被更广泛的类型数组使用。必须专门设计类型以使用继承多态性;你必须从一个类派生。类型可以非破坏性地(即:您不必更改类型本身)适应模板多态性。更重要的是,如果您的模板原型(prototype)设计得很好:
template<typename T>
void Stuff(T &t)
{
call(t, 15);
}

所有这一切 Stuff要求是有一些函数需要 T&和一个整数值。如果我想与 Stuff 一起使用某种类型,我所要做的就是定义一个 call在适当的命名空间(即定义类型的命名空间)中的函数。这将工作得很好。所有这些都无需修改类型本身。

当然,编译时多态是……编译时。如果我想要一些用户输入或数据文件来选择多态类型,模板不会有很大帮助(尽管类型删除,一种基于模板的技术,可以提供帮助)。运行时多态的主要好处是它确实是运行时。

另一个好处是它的原型(prototype)更精确。一切都明确说明了继承。基类中的虚函数接口(interface)布局清晰。编译器将阻止您尝试错误地使用该基类(调用其上不存在的方法)。事实上,一个体面的 IDE 将指导您的代码,以便您只能看到基类上的方法。

模板多态性要隐含得多。由于 C++ 无法拼出特定模板函数/类放在类型上的原型(prototype),因此很容易意外调用模板类型上不应该调用的内容。只有当您尝试使用不适合原型(prototype)的类型时,编译器才会检测到这一点。即便如此,您通常也会收到大量错误信息(取决于模板代码的嵌套深度),这使得您很难知道问题出在哪里。

实现隐式模板多态原型(prototype)也困难得多,因为它没有详细说明。实现派生类需要遍历基类,查看所有虚函数并实现它们。对模板原型(prototype)执行此操作要困难得多,除非某处有说明文档。如果您未能实现某事,您将再次收到错误信息,而该错误信息通常不会出现在问题上。

关于c++ - 模板和多态有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555864/

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