zoukankan      html  css  js  c++  java
  • 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同学,我开始写博客的目的就是把自己看到的,用自己的理解写出来,算是抛砖引玉,让更多高手来扶正。

  • 相关阅读:
    P1308 统计单词数(cin,getline() ,transform() )
    解决ASP.NET中的各种乱码问题
    GUID
    c# Thread、ThreadPool、Task的区别
    线程学习参考
    异步
    Lamda简单使用
    ubuntu上安装docker
    Git设置ssh密钥
    Git客户端(TortoiseGit)基本使用详解
  • 原文地址:https://www.cnblogs.com/qionghua/p/2607071.html
Copyright © 2011-2022 走看看