zoukankan      html  css  js  c++  java
  • C#重载重写

    overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字。
    override:过载也称重写是指子类对父类中虚函数或抽象函数的“覆盖”(这也就是有些书将过载翻译为覆盖的原因),但是这种“覆盖”和用new关键字来覆盖是有区别的。
    new:覆盖指的是不同类中(基类或派生类)有两个或多个返回类型、方法名、参数都相同,但是方法体不同的方法。
    但是这种覆盖是一种表面上的覆盖,所以也叫隐藏,被覆盖的父类方法是可以调用得到的。
    重载覆盖的发生条件:
    重载,必然发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关
    重写,必然发生在基类和派生类中,其类函数用virtual修饰,派生类用override修饰
    覆盖,在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字
    重载示例:

    复制代码
            public void Fun()
    {
    Console.WriteLine("I am F");
    }
    public void Fun(int i)
    {
    Console.WriteLine("I am F,i={0}",i);
    }
    复制代码

    override重写特性:
    由 override 声明重写的方法称为重写基方法,重写的基方法必须与 override 方法具有相同的签名。
    重写的基方法必须是 virtual、abstract 或 override 的,不能重写非虚方法或静态方法
    override的方法和virtual的方法必须具有相同的访问级别修饰符,不能更改 virtual 方法的可访问性
    不能使用new、static 或 virtual 修饰符来修改 override 方法。
    重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract 或 override 的。
    覆盖示例:
    当我们没有使用覆盖时,派生类继承基类,结果如下:

    复制代码
        class A
    {
    public void Fun()
    {
    Console.WriteLine("I am F");
    }
    }
    class Program:A
    {
    static void Main(string[] args)
    {
    Program p = new Program();
    p.Fun();
    Console.Read();
    }
    }
    //结果为:I am F
    复制代码

    当我们覆盖原来的方法呢?

    复制代码
        class A
    {
    public void Fun()
    {
    Console.WriteLine("I am F");
    }
    }
    class Program:A
    {
    public new void Fun()
    {
    int i = 1;
    Console.WriteLine("I am F,i={0}", i);
    }
    static void Main(string[] args)
    {
    Program p = new Program();
    p.Fun();
    Console.Read();
    }
    }
    //结果为:I am F,i=1
    复制代码

    new覆盖与重写、重载的区别:
    当子类与父类的参数不同时
    当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载)

    当基类函数是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载;因为参数不同,所以不是重写)
    当子类与父类的参数相同时
    当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载,因为基类不是虚函数,所以是隐藏不是重写)

    当基类函数是虚函数时,基类函数将被覆盖。(因为子类和基类不在同一范围内,所以不是重载)
    那么为什么不是重写呢?我们可以做一个例子还测试一下,这个例子在虚函数时已经举过,在这里为了说明此问题在重复一下:

    复制代码
        class A
    {
    public virtual void Fun()
    {
    Console.WriteLine("I am F");
    }
    }
    class Program:A
    {
    public override void Fun()
    {
    int i = 1;
    Console.WriteLine("I am F,i={0}", i);
    }
    static void Main(string[] args)
    {
    A p = new Program();
    p.Fun();
    Console.Read();
    }
    }
    复制代码

    我们知道,以上例子中,派生类存在一个对基类的重写方法,所以结果为:I am F ,i=1
    若是我们把override换成new,那么如果是重写的话,会和上面的结果相等,但实际结果是什么呢?
    实际的结果是:I am F
    由此我们知道,当基类函数是虚函数时,基类函数不是重写,而是覆盖了基函数的同名函数。

  • 相关阅读:
    VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布 Inchroy's Blog 博客频道 CSDN.NET
    编写可丢弃的代码
    c++ using namespace std; 海明威 博客园
    解决MySQL server has gone away
    nginx upstream 调度策略
    (2006, 'MySQL server has gone away') 错误解决 dba007的空间 51CTO技术博客
    Linux IO模型漫谈(2) 轩脉刃 博客园
    redis源码笔记 initServer 刘浩de技术博客 博客园
    MySQLdb批量插入数据
    词库的扩充百度百科的抓取你知道这些热词吗? rabbit9898 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/sunqiang/p/4369413.html
Copyright © 2011-2022 走看看