多态性和方法重载在C++中几乎是一样的

Is Polymorphism and Method Overloading almost the same thing in C++

本文关键字:一样 方法 重载 C++ 多态性      更新时间:2023-10-16

在C++中,有两种类型的多态性:

  1. 对象多态性
  2. 功能多态性

函数多态性与方法或函数重载完全相同,即我们使用相同的方法名称和不同的参数和返回类型。现在的问题是,为什么我们在OOP中有这个奇特的名称多态性

多态性和方法重载的区别是什么?有人能用一个场景来解释吗。感谢

多态性意味着"多种形式"。

在计算机科学中,主要有三种不同的多态性:

  • 特设多态性
    • 函数重载
    • C++模板专业化
  • 亚型多态性
    • 子类化和虚拟方法
  • 参数多态性
    • C++模板
    • C#与Java泛型
    • ML中的多态函数

多态性是一个概念。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=>多个,Morph=>形式。

简单地说,C++中存在许多多态性机制,函数重载是多态性的一种。

http://www.catonmat.net/blog/cpp-polymorphism/

多态性的本质是通过单一语法形式(通常是C++中的函数调用)提供不同行为的能力。根据这个定义,虚拟函数调用(实际上代表OOP多态性)和重载函数调用都是多态的。

它们之间的区别在于在每种情况下选择特定行为的方式和

对于虚拟函数调用,它是在运行时中根据调用函数成员的对象的动态类型进行的。(当然,如果通过基类指针或引用调用。如果直接调用,将在编译时选择)。

对于重载函数调用,它是在编译时根据函数调用的签名(参数的类型和数量+cv限定符)进行的。

因此,简而言之,差异重载是静态多态性,在编译时解决,虚拟函数是动态多样性,在运行时解决。

多态性与方法重载不同。来自维基百科:

多态性与方法重载或方法不同重写,[1](称为ad-hoc多态性[2])。多态性只与特异性接口或更通用基类的实现。方法重载指的是名称相同但不同的方法同一类中的签名。方法重写是在子类替换其父类的一个或多个的实现方法。方法重载和方法重写都不是通过多态的自身实现

在多态性中,方法被重写而不是重载(这意味着子对象有自己的继承函数实现,但它具有相同的签名)。因此,您所称的函数多态性实际上只是方法重载或特殊多态性。

这两件事被定义为:

静态多态性:重载函数的关联称为静态多态性。

函数重载:当存在多个具有不同行为\签名的函数\上下文时,称为函数重载。

注意:如果存在一个具有不同签名的函数,并且我们没有将这些函数与对象绑定,则不能说存在静态多态性。

相关文章: