2 qq 31461149 qq_31461149 于 2016.03.29 19:32 提问

C#的一个关于继承很基础但又很让我不解的问题。。。
     class Program
    {
        static void Main(string[] args)
        {          
            Person p = new Student();
            Console.WriteLine(p.GetType());
            p.SayHi();
            Console.ReadKey();
        }

        class Person
        {
            public void SayHi()
            {
                Console.WriteLine("我是人类");
            }
        }

        class Student : Person
        {
            public new void SayHi()
            {
                Console.WriteLine("我是学生");
            }
        }
    }

如代码,p 这个对象通过p.getType()可知它的类型是Student类
既然是Student类
那么调用它的SayHi方法就应该调用Student类里的SayHi方法啊
可是实际上却调用了Person类的SayHi方法

结果应该所有人都知道,但是为什么呢
真的很不理解为什么,有没有比较懂原理的解释一下~

2个回答

caozhy
caozhy   Ds   Rxr 2016.03.30 00:18

因为你是new,所以两个SayHi()其实毫无关系,只是碰巧名字一样而已。

p.SayHi();调用的不是继承的那个SayHi,如果你要调用,必须类型转换
(p as Student).SayHi();

再多说一点,这个new其实是很少用到的,如果你写了1年代码,从来没用到它,那很正常,不但如此,除非迫不得已,根本也没必要用。

weitao0912
weitao0912   2016.03.30 22:31

就你的例子而言Person p = new Student();
其中Person是申明类,Student是实例类;运行到 p.SayHi()时,会先去申明类Person中的SayHi()方法检查是否有Virtual关键字;
如果没有,执行的的就是申明类的SayHi()方法;如果有,回去实例类中检查是否有override关键字,有的话执行的就是实例类中的方法;
如果实例类中没有override关键字,那么就会去实例类的基类中去找,一直找到这个方法的父方法

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!