欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#方法隐藏new、虚方法virtual、重写override及隐藏和重写的区别

程序员文章站 2024-03-16 23:57:28
...

【概念】方法隐藏使用关键字new、方法重写使用关键字override,虚函数使用关键字virtual修饰的函数。虚函数从功能上和普通的函数没有区别,虚函数可以被子类隐藏,也可以被子类重写,而非虚函数只能被子类隐藏。

那么重写和隐藏的区别是什么呢?运行以下代码,发现,在向上转型时输出的结果不一样。原理如下:
隐藏原理如下:C#方法隐藏new、虚方法virtual、重写override及隐藏和重写的区别
C#方法隐藏new、虚方法virtual、重写override及隐藏和重写的区别


class Animal
{
    public void Show()
    {
        Console.WriteLine("Animal Show");
    }
}

//内存空间:堆、栈、方法区。调用方法就是从方法区中调用到栈中执行

class Cat : Animal
{
    //1、Cat类中还能写Show方法吗?不考虑重载。答案:能。若再写一个Show方法,则调用子类的方法。

    //此处Show提示:Cat.Show()"隐藏继承的成员Animal.Show()",如果是有意隐藏,请使用关键字new
    //public void Show()
    //{
    //    Console.WriteLine("Cat Show");
    //}
    public new void Show()
    {
        Console.WriteLine("Cat Show");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        Cat c = new Cat();
        c.Show();


        //Q:a是调用的Cat.Show还是Animal.Show?A:调用的是Animal.Show,原理是在Cat类型中寻找Animal.Show方法
        Animal a = new Cat();
        a.Show();
    }
}
using System;

class Animal
{
    //virtual关键字,虚方法
    public virtual void Show()
    {
        Console.WriteLine("Animal Show");
    }
}
class Cat : Animal
{
    //override重写
    public override void Show()
    {
        Console.WriteLine("Cat show");
    }
}
class Program
{
    public static void Main(string[] args)
    {
        //实例化一个Cat对象
        Cat c = new Cat();
        c.Show();
        //打印结果是"Cat show"

        Animal cc = new Cat();
        cc.Show();
        //打印结果是"Cat show"
    }
}