using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyTest { class Number { public Number() { Console.WriteLine("我是父类的构造函数"); } public void test() { Console.WriteLine("纯测试"); } public static int i = 123; public virtual void ShowInfo() { Console.WriteLine("base class....."); } public virtual void ShowNum() { Console.WriteLine(i.ToString()); } } class IntNumber : Number { public IntNumber() { Console.WriteLine("我是子类的构造函数"); } public void test() { Console.WriteLine("纯测试子类"); } new public static int i = 456; public new virtual void ShowInfo() { Console.WriteLine("son class....."); } public override void ShowNum() { Console.WriteLine("base num is {0}",Number.i.ToString()); Console.WriteLine("new num is {0}",i.ToString()); } } class Program { static void Main(string[] args) { Number num = new Number(); num.ShowNum(); IntNumber intnum = new IntNumber(); intnum.ShowNum(); intnum.ShowInfo(); Number number = new IntNumber(); number.test(); number.ShowInfo(); number.ShowNum(); } }
1.父类引用指向父类对象:调用的时候只能调用父类的方法,方法表中根本没有子类。
2.子类引用指向子类对象:调用的时候既能调用子类的方法,也能调用从父类继承的方法(包括虚方法和实例方法<存疑:既然子类的方法表中没有父类的实例方法,它是如何由子类引用调到的呢?>),特别注意,在调用子类的构造函数的时候,会首先调用父类的构造方法!ps.方法表:包括非虚方法表和虚方法表,按照继承的虚方法、新引入的虚方法、实例方法和静态方法排列。
3.父类引用指向子类对象:
第一点:在调用构造函数的时候仍然是按照先父类构造函数,再子类构造函数的方法进行调用。
第二点:父类引用是无法调用父类中没有,而子类特有的方法的。
第三点:对于父类和子类都有的同名方法(除去构造方法)又分以下几种情况:
1.对于实例方法,只执行父类的方法,子类的没有被执行。
2.对于虚方法,如果子类有覆写override,则只执行子类的方法,将父类的虚方法屏蔽掉。
3.对于虚方法,如果子类有一个new关键字,也就是说父类和子类是两个不同的虚方法,则只执行父类的虚方法。<其实没有new的话不也是只执行父类的方法虚方法么?这有什么用?new用作隐藏父类的同名成员,语义上和override互斥>
4.关于继承的层次问题。
孙子类重写override方法,如果父类和爷爷类都有虚方法,则只重写父类的虚方法。如果爷爷类特有的虚方法,则重写爷爷类的虚方法,一直能递归到object的虚方法