Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多态性和重载之间的区别是什么?_C++_Haskell_Computer Science - Fatal编程技术网

C++ 多态性和重载之间的区别是什么?

C++ 多态性和重载之间的区别是什么?,c++,haskell,computer-science,C++,Haskell,Computer Science,我理解多态性,模糊地理解重载,但如果有人能够完全理解这两个概念,来解释分类差异是什么,以及重载是否是多态性的一种形式,我将不胜感激(似乎对此有分歧).多态性:一种方法,根据调用它的参数的类型具有多个实现。通常在编译时不知道。参数的数目是固定的,在C++中,类型唯一的唯一的参数是第一个参数(这个< /代码>)。在C++中,这一通用版本需要一个基类,它具有“代码>虚拟< /COD>方法”。 重载:一个名称,实际上是多个方法,具体取决于调用它的参数的计数和类型。总是在编译时决定。不涉及基类 如果你想打

我理解多态性,模糊地理解重载,但如果有人能够完全理解这两个概念,来解释分类差异是什么,以及重载是否是多态性的一种形式,我将不胜感激(似乎对此有分歧).

多态性:一种方法,根据调用它的参数的类型具有多个实现。通常在编译时不知道。参数的数目是固定的,在C++中,类型唯一的唯一的参数是第一个参数(<代码>这个< /代码>)。在C++中,这一通用版本需要一个基类,它具有“代码>虚拟< /COD>方法”。 重载:一个名称,实际上是多个方法,具体取决于调用它的参数的计数和类型。总是在编译时决定。不涉及基类


如果你想打个比方的话:多态性是指你雇了十几个专业的机械师来修理汽车,他们中的每一个都有类似于
do\u work(vehicle)
take\u休假(duration)
的功能。每个人都做了不同的事情,但是除了C++中的“隐含的”这个参数(在Python中,Ak<代码>“自我/代码>”),它们都具有相同的签名。超载是指雇佣通才机械师,他们中的每一个都有
do\u work(转向)
do\u work(照明)
do\u work(引擎)
,等等。

超载是多态性的一个子集。多态性有两种类型:在运行时和编译时。重载属于后一种(编译时/静态多态性还有一些其他方面,如模板函数指针

通常,作者将多态性指的是在运行时完成的多态性(除非另有说明),如果您谈论的是该多态性,那么很明显,一个多态性是在运行时完成的(John的回答已经在他的回答中画出了基本的区别w.r.t继承/虚拟函数)当函数参数决定调用哪个重载时,重载在编译时完成

重载-静态多态性(演示)

下面的屏幕截图可以演示函数重载是如何静态的(在运行时之前解决)

p.S


在这种情况下,您想看到,这是一个关于多态性的相关问题,其核心是关于多个事物,它们都有一组特定的一致行为,这样您就可以在特定的算法或过程中用另一个替换它们。只要它们都提供了预期的接口,流程就仍然有效

<>过载不是真的有这样的基础。它只是能够用相同的名称命名两个或多个函数,只要它们有不同的参数列表。编译器根据您传递的参数类型确定您实际使用的函数

现在可以使用重载创建多态性。考虑以下事项:

template<typename T>
void func(T t) {call(t);}
这样,
func
是一个相对于其参数具有多态性(静态)的函数。它可以对任何类型执行操作,只要该类型具有适当的接口。该接口能够使用该类型的变量调用函数
call

func(5); //Legal
func(13.4); //Legal
func(vector<int>{4, 3, 2, 1}); //Legal
func(vector<float>{}); //NOT legal
func(5)//合法的
func(13.4)//合法的
func(向量{4,3,2,1})//合法的
func(向量{})//不合法
在这里,我们使用
call
的函数重载通过
func
函数创建一种形式的polymophism。但这并不意味着重载就是多态性


重载是一种语言工具。多态性是一个概念。多态性是使多个对象以相同的方式工作。重载只是给不同函数取相同名称的一种方式。

C++还有“静态多态性”,它不是重载。@JohnZwinck I是指它的一种静态多态性。但是谢谢你在那里引起注意。我已经更新了itI,我不认为所有函数重载都是一种动态多态性。编译器必须在编译时解决非虚函数重载问题。@TrevorHickey我想你误读了我的评论。我的意思是重载是不同类型的静态多态性(模板、函数指针等)之一,我添加了屏幕截图来回答进一步阐述,最后一段是黄金!!“编译时多态性”呢?@NickyC:C++中有两种编译时多态性:一种是优化,因为编译器看到需要调用哪个实现,另一种是使用模板元编程的语言功能。第一种方法仍然依赖于
虚拟
方法,但提高了性能;第二个依赖于显式使用类型编程。实际上,我建议,术语“编译时多态性”的存在可能与您的答案相反。您对多态性的描述似乎更多地是关于动态调度,而不是具有更广泛含义的术语“多态性”。@NickyC:当然,这就是为什么我在回答中点头表示“在编译时通常不知道”。但OP是一个新手,因此,这个讨论基本上与给定的问题无关。你可以做得比在维基百科上查找更糟糕:Haskell有参数多态性,在这里你有在多种类型上相同工作的函数,例如
length::[a]->Int
适用于字符串列表、双精度列表等。你只需要一个定义,作为一个参数多态性值,它不关心参数是什么,只关心使用它的位置。它还具有用于特殊多态性的类型类,这些函数的实现依赖于类型,例如
show::show a=>a->String
是一系列函数,每个函数都有自己的定义:
show::Int->Strin
func(5); //Legal
func(13.4); //Legal
func(vector<int>{4, 3, 2, 1}); //Legal
func(vector<float>{}); //NOT legal