A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fcyan86 中级黑马   /  2013-6-5 10:20  /  1127 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 fcyan86 于 2013-6-5 16:09 编辑

代码:
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             B b=new B();
  6.             b.M();
  7.             C c=new C();
  8.             c.M();
  9.             A a;
  10.             a = b;
  11.             a.M();
  12.             a = c;
  13.             a.M();
  14.             /*
  15.              * 输出结果如下:
  16.              * New B.M
  17.              * override C.M
  18.              * A.M
  19.              * override C.M
  20.              */
  21.         }
  22.     }

  23.     class A
  24.     {
  25.          public virtual void M()
  26.          {
  27.              Console.WriteLine("A.M");
  28.          }
  29.     }

  30.     class B:A
  31.     {
  32.          public new void M()
  33.          {
  34.              Console.WriteLine("New B.M");
  35.          }
  36.     }

  37.     class C:A
  38.     {
  39.         public override void M()
  40.         {
  41.             Console.WriteLine("override C.M");
  42.         }
  43.     }
复制代码
那么问题是:使用override重写时,是将父类中的虚方法重写了。当使用new将父类的方法隐藏,那么当如上面代码所示,当进行:a=b;运算时是不是隐含的类型转换将B类转换为A类时,同时会将B类中new出的M方法丢失,还是根new父类的方法一样,将子类中的该方法隐藏。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
确实隐式的转换了,new并没有覆盖(重写)父类方法,所以调用了A.M;而C重写了A的方法,要访问的父类的方法需要用base.M()才行。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 淡定

查看全部评分

回复 使用道具 举报
A a;
a = b;
a.M();
等价于:
A a = new B();
a.M();
如果调用a.M(),程序就会先调用A类的M方法,发现A类的M方法是虚拟的,同时又发现‘a’又指向了B类,所以程序又会查看B类的M方法,发现没有被重写,所以就输出了A的方法。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
提问的很详细  不错
回复 使用道具 举报
  1. B b=new B();
  2.             b.M();
  3.             C c=new C();
  4.             c.M();
  5.             A a;
  6.             a = b;
  7.             a.M();
  8.             a = c;
  9.             a.M();

  10.             B b1 = (B)(a = b);
  11.             b.M();
  12.             C c1 = (C) (a = c);
  13.             c1.M();
  14.             /*
  15.              * 输出结果如下:
  16.              * New B.M
  17.              * override C.M
  18.              * A.M
  19.              * override C.M
  20.              * New B.M
  21.              * override C.M
  22.              */
复制代码
运行试了试,看运行结果应该是子类转换为父类时,子类并没有丢失任何数据。学习了………………

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马