C# 基础系列继承二(多态是不是重载)

  上一遍提到了多态和重载,我刚刚查了下资料,发现我之前的说法是错的。开始我也被百度百科的说法给迷住了。

百度百科多态是不是重载

第一种说法
  重载是一种是多态(如C++),有四种形式的多态:   1.虚函数多态   2模板多态   3重载   4转换   所谓的动态和静态区分是另一种基于绑定时间的多态分类,严格来说,重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_foo和char_foo等等,以此来区别调用。故重载仍符合多态定义——通过单一标识支持不同特定行为的能力,只是重载属于静态多态,而不是通过继承和虚函数实现的动态多态。
第二种说法
  重载(overload)和多态无关,真正和多态相关的是覆盖(override)。   当派生类重新定义了基类的虚拟方法后,基类根据赋给它的不同的派生类引用,动态地调用属于派生类的对应方法,这样的方法调用在编译期间是无法确定的。因此,这样的方法地址是在运行期绑定的(动态绑定)。   重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。   不过针对所谓的第二种重载,有一个专门的名词--重写或重定义。重载与重写的区别就在于是否覆盖,重写一般多发生在不同的类且存在继承关系之间,而重载多是在一个类里或者一块代码段里。

  

百度百科多态

多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOD)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。   C++中,实现多态有以下方法:虚函数,抽象类,重载,覆盖,模版。

  

MSDN C#版

多态性常被视为自封装和继承之后,面向对象的编程的第三个支柱。 Polymorphism(多态性)是一个希腊词,指“多种形态”,多态性具有两个截然不同的方面:

在运行时,在方法参数和集合或数组等位置,派生类的对象可以作为基类的对象处理。 发生此情况时,该对象的声明类型不再与运行时类型相同。

基类可以定义并实现虚方法,派生类可以重写这些方法,即派生类提供自己的定义和实现。 在运行时,客户端代码调用该方法,CLR 查找对象的运行时类型,并调用虚方法的重写方法。 因此,您可以在源代码中调用基类的方法,但执行该方法的派生类版本。

  

msdn VB版

“多态性”指定义具有功能不同但名称相同的方法或属性的多个类的能力,这些类可由客户端代码在运行时交换使用。

  

 msdn无论C#版还是VB版,都指出了这个是要通过继承来实现多态。所以重载不一定是多态。

再次谢谢 madfrag同学,我开始写博客的目的就是把自己看到的,用自己的理解写出来,算是抛砖引玉,让更多高手来扶正。

原文地址:https://www.cnblogs.com/qionghua/p/2607071.html