c# override,new关键字区别与使用
原文地址http://www.cnblogs.com/cgy985/archive/2007/11/20/966118.html
先看段代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //baseClass bc; class1 ct11 = new class1(); baseClass ct12 = new class1(); class2 ct21 = new class2(); baseClass ct22 = new class2(); ct11.prinf(); ct12.prinf(); Console.WriteLine("---------------------"); ct21.prinf(); ct22.prinf(); } } public class baseClass { private int index = 0; public virtual void prinf() { Console.WriteLine("这是基类虚方法" + index.ToString()); } } public class class1 : baseClass { private int index = 1; public override void prinf() { Console.WriteLine("这是子类新的方法" + index.ToString()); } } public class class2 : baseClass { private int index = 2; public new void prinf() { Console.WriteLine("这是子类新的方法" + index.ToString()); } } }
运行结果:
这是子类新的方法1
这是子类新的方法1
---------------------
这是子类新的方法2
这是基类虚方法0
如上,
使用override重写printf方法,通过父类引用一样只能看到重写后的方法;
如果使用new隐藏printf方法,父类子类引用各自对应方法;
override重写虚方法,那么就只剩下重写以后的方法;
new隐藏基类的方法,那么基类的方法和当前类的方法同时存在只是被隐藏了;
再仔细理解一下
如:飞禽 bird = new 麻雀();
//那么飞禽就是申明类,麻雀是实例类。
//具体的检查的流程如下
//1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;
//2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。