我理解多态,并且模糊地理解重载,但是会理解那些完全理解有两个概念的人来解释分类差异是什么以及重载是否是多态的形式(似乎对此有不同意见)。
答案 0 :(得分:8)
多态性的核心是多个事物,它们都具有一定的一致性行为,这样您就可以在特定的算法或过程中替换另一个。只要它们都提供了预期的界面,该过程仍然有效。
超载并没有真正有这样的基础。它只是能够为两个或多个具有相同名称的函数命名,只要它们具有不同的参数列表即可。编译器根据您传递的参数类型确定实际意味着哪个函数。
现在重载可用于创建多态。请考虑以下事项:
template<typename T>
void func(T t) {call(t);}
这将调用call
,将t
作为参数传递。只要您提供T
类型call(t)
是合法的C ++代码,这将有效。您可以通过为call
使用的任何类型重载函数func
来实现此目的:
void call(int);
void call(float);
void call(vector<int>);
通过这种方式,func
是一个关于其参数的多态(静态)函数。它可以对任何类型执行操作,只要该类型具有适当的接口即可。该接口能够使用该类型的变量调用函数call
。
func(5); //Legal
func(13.4); //Legal
func(vector<int>{4, 3, 2, 1}); //Legal
func(vector<float>{}); //NOT legal
在这里,我们使用call
的函数重载来通过func
函数创建一种形式的多态性。但这并不意味着重载是多态。
重载是一种语言工具。多态性是一个概念。多态性是指使多个对象以相同的方式工作。重载只是一种赋予不同功能同名的方法。
答案 1 :(得分:4)
多态性:一种方法,它具有多个实现,具体取决于调用它的参数的类型。通常在编译时不知道。参数的数量是固定的,在C ++中,唯一一个类型重要的参数是第一个(this
)。在C ++中,它的通用版本需要一个带有virtual
方法的基类。
重载:一个名称实际上是多个方法,具体取决于调用它的参数的计数和类型。始终在编译时决定。不涉及基类。
如果你想要一个类比:多态性就是当你雇用十几个专业技师来处理汽车时,他们每个人都有do_work(vehicle)
和take_vacation(duration)
等功能。每个人都做了不同的事情,但他们都有相同的签名,除了C ++中的“隐含此”参数(在Python中也称为self
等)。重载就是当你雇用通才机制时,每个人都有do_work(steering)
,do_work(lighting)
,do_work(engine)
等。
答案 2 :(得分:1)
重载是多态的一个子集。多态性有两种类型:运行时和编译时。重载属于后者(还有编译时/静态多态的其他方面,如模板,函数指针 )
通常作者将多态性引用到在运行时完成的那个(除非指定),如果你在谈论那个多态性,那么显然 一个就完成了运行时( John的答案已经在继承/虚函数中得出了基本的差异)并且当你的函数参数决定哪个时候在编译时完成了重载过度被称为。
重载 - 静态多态 (演示)
以下屏幕截图可以演示函数重载是如何静态的(在运行时解析)
<强> P.S 强>
如果您希望看到,这是与overloading and virtual functions
相关的问题