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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 经睿 黑马帝   /  2011-12-20 12:14  /  2452 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 经睿 于 2011-12-20 17:21 编辑

当声明一个父类对象指向一个子类对象时,在该对象中调用一个父类和子类中都存在的方法,如果子类没有重写父类的这个方法,那么为什么会调用父类的这个方法而不是子类的
代码如下
  1.     class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Animal a = new Animal();
  6.             a.Eat();

  7.             Animal ac = new Cat();
  8.             ac.Eat();

  9.             Cat c = new Cat();
  10.             c.Eat();

  11.             Console.ReadKey();
  12.         }
  13.     }
  14.     public class Animal
  15.     {
  16.         public virtual void Eat()
  17.         {
  18.             Console.WriteLine("Animal eat");
  19.         }
  20.     }

  21.     public class Cat : Animal
  22.     {
  23.         public new void Eat()
  24.         {
  25.             Console.WriteLine("Cat eat");
  26.         }
  27.     }
复制代码
运行结果为:

Animal eat
Animal eat
Cat eat

评分

参与人数 1技术分 +1 收起 理由
朱勋 + 1

查看全部评分

5 个回复

正序浏览
new是隐藏了父类(Animal)的Eat方法,所以Cat里面的Eat跟Animal中的Eat是没有关系的,当你把ac(Animal类)指向一个Cat对象的时候,自然而然的是调用Animal的Eat.
override是覆盖..就是重新把父类的方法实现
没事少用new,会破坏继承,会把人搞晕的
回复 使用道具 举报
经睿 黑马帝 2011-12-20 13:13:45
报纸
董志 发表于 2011-12-20 12:48
也不是完全没有关系,如果是虚方法被重写了,那就有很大关系了,呵呵

嗯,虚方法和抽象方法是特例,编译器在编译的时候肯定会做特殊处理的
回复 使用道具 举报
董志 黑马帝 2011-12-20 12:48:10
板凳
也不是完全没有关系,如果是虚方法被重写了,那就有很大关系了,呵呵
回复 使用道具 举报
经睿 黑马帝 2011-12-20 12:37:31
藤椅
想明白了挺简单的。ac对象既然被声明为Animal类型,和Cat类中定义的函数一毛钱的关系都没有。我基础太不扎实了,汗颜。{:soso_e127:}
回复 使用道具 举报
董志 黑马帝 2011-12-20 12:27:51
沙发
本帖最后由 董志 于 2011-12-20 12:29 编辑

没有重写的话,编译器会把cat蜕化成animal使用,不在具有猫独有的特点,仅是一个动物而已,虽然它确实是猫
如果父类中eat是虚的,子类重写了,则会根据具体对象调用。这个叫多态。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马