C#方法隐藏new、虚方法virtual、重写override及隐藏和重写的区别
程序员文章站
2024-03-16 23:57:28
...
【概念】方法隐藏使用关键字new、方法重写使用关键字override,虚函数使用关键字virtual修饰的函数。虚函数从功能上和普通的函数没有区别,虚函数可以被子类隐藏,也可以被子类重写,而非虚函数只能被子类隐藏。
那么重写和隐藏的区别是什么呢?运行以下代码,发现,在向上转型时输出的结果不一样。原理如下:
隐藏原理如下:
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"
}
}