黑马程序员技术交流社区
标题:
一个关于多态的问题
[打印本页]
作者:
经睿
时间:
2011-12-20 12:14
标题:
一个关于多态的问题
本帖最后由 经睿 于 2011-12-20 17:21 编辑
当声明一个父类对象指向一个子类对象时,在该对象中调用一个父类和子类中都存在的方法,如果子类没有重写父类的这个方法,那么为什么会调用父类的这个方法而不是子类的
代码如下
class Program
{
static void Main(string[] args)
{
Animal a = new Animal();
a.Eat();
Animal ac = new Cat();
ac.Eat();
Cat c = new Cat();
c.Eat();
Console.ReadKey();
}
}
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("Animal eat");
}
}
public class Cat : Animal
{
public new void Eat()
{
Console.WriteLine("Cat eat");
}
}
复制代码
运行结果为:
Animal eat
Animal eat
Cat eat
作者:
董志
时间:
2011-12-20 12:27
本帖最后由 董志 于 2011-12-20 12:29 编辑
没有重写的话,编译器会把cat蜕化成animal使用,不在具有猫独有的特点,仅是一个动物而已,虽然它确实是猫
如果父类中eat是虚的,子类重写了,则会根据具体对象调用。这个叫多态。
作者:
经睿
时间:
2011-12-20 12:37
想明白了挺简单的。ac对象既然被声明为Animal类型,和Cat类中定义的函数一毛钱的关系都没有。我基础太不扎实了,汗颜。{:soso_e127:}
作者:
董志
时间:
2011-12-20 12:48
也不是完全没有关系,如果是虚方法被重写了,那就有很大关系了,呵呵
作者:
经睿
时间:
2011-12-20 13:13
董志 发表于 2011-12-20 12:48
也不是完全没有关系,如果是虚方法被重写了,那就有很大关系了,呵呵
嗯,虚方法和抽象方法是特例,编译器在编译的时候肯定会做特殊处理的
作者:
李荣壮
时间:
2011-12-20 13:23
new是隐藏了父类(Animal)的Eat方法,所以Cat里面的Eat跟Animal中的Eat是没有关系的,当你把ac(Animal类)指向一个Cat对象的时候,自然而然的是调用Animal的Eat.
override是覆盖..就是重新把父类的方法实现
没事少用new,会破坏继承,会把人搞晕的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2