多态和重载有什么区别?

McL*_*odx 10 c++ computer-science haskell

我理解多态性并且模糊地理解重载,但是会理解那些完全理解有两个概念的人来解释分类差异是什么以及重载是否是多态的形式(似乎对此有不同意见).

Nic*_*las 8

多态性的核心是多个事物,它们都具有一定的一致性行为,这样您就可以在特定的算法或过程中替换另一个.只要它们都提供了预期的接口,该过程仍然有效.

重载并没有真正有这样的基础.它只是能够为两个或多个具有相同名称的函数命名,只要它们具有不同的参数列表即可.编译器根据您传递的参数类型确定您实际使用的函数.

现在重载可用于创建多态.考虑以下:

template<typename T>
void func(T t) {call(t);}
Run Code Online (Sandbox Code Playgroud)

这将调用call,t作为参数传递.只要你提供一个类型这将工作T的这call(t)是合法的C++代码.您可以通过重载函数call来执行此操作,无论您感兴趣使用哪种类型func:

void call(int);
void call(float);
void call(vector<int>);
Run Code Online (Sandbox Code Playgroud)

以这种方式,func是关于其参数的多态(静态)的函数.它可以对任何类型执行操作,只要该类型具有适当的接口即可.该接口是能够call使用该类型的变量调用函数的能力.

func(5); //Legal
func(13.4); //Legal
func(vector<int>{4, 3, 2, 1}); //Legal
func(vector<float>{}); //NOT legal
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用函数重载call来通过func函数创建一种形式的多态性.但这并不意味着重载是多态的.

重载是一种语言工具.多态性是一个概念.多态性是指使多个对象以相同的方式工作.重载只是赋予不同功能相同名称的一种方法.