在 C++ 中,有两种类型的多态性:
- 对象多态
- 函数多态
函数多态与方法或函数重载完全相同,即我们使用相同的方法名称,但参数和返回类型不同。现在的问题是为什么我们在 OOP 中有这个花哨的名字多态性?
多态性与方法重载的明显区别是什么?有人可以用一个场景来解释。谢谢
在 C++ 中,有两种类型的多态性:
函数多态与方法或函数重载完全相同,即我们使用相同的方法名称,但参数和返回类型不同。现在的问题是为什么我们在 OOP 中有这个花哨的名字多态性?
多态性与方法重载的明显区别是什么?有人可以用一个场景来解释。谢谢
多态性意味着“多种形式”。
在计算机科学中,主要有三种不同的多态性:
多态是一个概念。AdHoc 多态性意味着同名不同的实现。
// Function overloading
void f(A a);
void f(B b);
// template specialization
template <typename T> class A;
template <> class A<int> {}
template <> class A<float> {}
多态性:Poly => Multiple,Morph => Form。
为了简单起见,C++中有很多多态机制,函数重载是多态的一种。
多态性的本质是能够通过单一语法形式(通常是 C++ 中的函数调用)提供不同的行为。根据这个定义,虚函数调用(实际上代表 OOP 多态性)和重载函数调用都是多态的。
它们之间的区别在于在每种情况下如何以及何时选择特定行为。
对于虚函数调用,它是根据调用函数成员的对象的动态类型在运行时进行的。(当然,如果通过基类指针或引用调用。如果直接调用它将在编译时被选中)。
对于重载的函数调用,它是根据函数调用的签名(参数的类型和数量+ cv-qualifiers)在编译时进行的。
所以简而言之,重载是静态多态性,在编译时解决,虚函数是动态多态性,在运行时解决。
多态性与方法重载不同。来自维基百科:
多态性与方法重载或方法覆盖不同,[1](称为临时多态性 [2])。多态性仅涉及将特定实现应用于接口或更通用的基类。方法重载是指在同一个类中具有相同名称但不同签名的方法。方法覆盖是子类替换其父类的一个或多个方法的实现的地方。方法重载和方法覆盖本身都不是多态性的实现
在多态中,方法被覆盖而不是重载(这意味着子对象有自己的继承函数的实现,但它具有相同的签名)。所以你所说的函数多态实际上只是方法重载或临时多态。
这两件事被定义为:
静态多态性:重载函数的关联称为静态多态性。
函数重载:当存在多个具有不同行为\签名的函数\上下文时,称为函数重载。
注意:如果存在一个具有不同签名的函数并且我们没有将这些函数与一个对象绑定,我们不能说存在静态多态性。