不解 。。。 能帮忙的进来看看ThankYou
刚刚看了遮天兄的帖子 这是原来帖子的内容程序代码:
using System; public class FatherClass//定义基类 { public void N()//基类的非虚方法 { Console.WriteLine("调用基类的非虚方法N"); } public virtual void V()//基类的虚方法 { Console.WriteLine("调用基类的虚方法V"); } } public class SonClass : FatherClass//定义派生类 { public new void N()//new关键字讲覆盖基类的同名方法N() { Console.WriteLine("调用派生类的非虚方法N"); } public override void V() { Console.WriteLine("调用派生类的虚方法V"); } } public class App//应用类 { public static void Main() { FatherClass fc=new FatherClass();//基类对象 SonClass sc = new SonClass();//派生类对象 fc=sc;//怎么这句加了跟没加是一样的啊?????????????? fc.N();//调用基类的N()方法 sc.N();//由于有new关键字修饰N()方法,所以本处调用的的是派生类的N()方法 fc.V(); sc.V(); Console.ReadKey(); } } 书上解释fc=sc只这样的:在运行时先fc=sc,所以调用的对象是fc现在实际所属类sc的方法,而不是fc被定义类的方法(红色部分不是很理解),如果这样的话怎么第一个输出的结果是“调用基类的非虚方法N呢”接着又说,程序中的对非虚方法的调用是在编译时已经确定了的,所以fc.N()sc,N()调用的是基类中的非虚方法N()。如果是这样的话,岂不是那个赋值语句 fc=sc没起到什么作用吗?百度了半天还是想不通?请前辈们指教其中一段代码
FatherClass fc=new FatherClass();//基类对象
SonClass sc = new SonClass();//派生类对象
fc=sc;//怎么这句加了跟没加是一样的啊??????????????
俺是这样的理解的
程序代码:
程序代码: fc=sc;//怎么这句加了跟没加是一样的啊?????????????? 是有区别的 程序代码: FatherClass fc=new FatherClass();//基类对象 SonClass sc = new SonClass();//派生类对象 fc=sc 这一句俺是这样理解的 虽然声明的对象是基类对象,但实际的内存空间是子类对象的。 如果不注释该行代码 程序代码: public new void N()//new关键字讲覆盖基类的同名方法N() { Console.WriteLine("调用派生类的非虚方法N"); } new 用于隐藏基类成员的继承成员。 实际上子类的N()已经被隐藏了 所以fc.N() 只会调用基类的N() sc.N();子类只会调用自己的方法 fc.V(); 注释fc=sc 不同的地方在于这里 如果不注释 就像先头所说的 虽然声明的对象是基类对象,但实际的内存空间是子类对象的 所以只会调用派生类的虚方法 当然也可以理解为子类重写基类虚方法 试着将子类 v()的override去掉 发现还是执行基类的v() 【MSDN有这样的解释 如果没有派生类重写该成员,则它可能是原始成员 】 这点俺就有点疑惑了 既然实际的内存空间是子类对象的 那原始成员又是哪里来的呢? 如果按子类重写基类虚方法来理解 一切就顺理成章了 如果不注释 很显然 则会变成调用基类的虚方法俺的理解是 虽然声明的对象是基类对象,但实际的内存空间是子类对象的。
这样理解对么? 可是原始成员就很难解释清楚了 疑惑