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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c#的基础练习题
这里转载一下c#的一些练习题,帮助巩固一下接口知识和重写方面的知识点 C#面向对象编程-练习题   1.C#中的方法重写使用关键字(a)。 a)    override b)   overload c)    static d)   Inherit 2.以下的C#代码,试图用来定义一个接口: public interface IFile{       intA;     
关于继承的一个问题
class A{public: A(){cout  virtual ~A(){cout };class B : public A{public: B(){cout  virtual ~B(){cout };class C : public B{public: C(){cout  virtual ~C(){cout };int Fun(int n){ cout  n = n/10; if
一个关于继承的问题
class MyA { int a = 1; public MyA() { print(); } public void print() { System.out.println("aaa" + a); } } class MyB extends MyA { int a = 2; public MyB() { print(); } public void print() { System.out.
一个奇怪的关于自冲销的问题,不解?
做自冲销的cube没有压缩过,也没有聚集,在执行完第一自冲销的dtp之后,cube的fact table的数据量增加了一倍,这个可以理解。但是在执行完第二次自冲销的DTP之后,数据量并没有翻倍,而是只增加了初始cube的数据量,之后每次执行自冲销的DTP,也只是增加了原始cube
java中关于继承的问题
java中关于继承
C#继承窗体
C#继承窗体 1、继承窗体的概念 继承窗体就是根据现有窗体的结构创建一个与其一样的新窗体,这种从现有窗体继承的过程称为可视化继承。 2、创建继承窗体 1)新建一个项目,添加一个Windows窗体base.cs(类名命名为BaseClass),如下图: 为按钮添加点击事件,是文本框中的数自动加1,如下: private void btnCount_Click(object sende
C#之封装和继承
万丈高楼平地起,勿在浮沙筑高台。不知道是不是由于之前VB基础没打好的原因,自从开到C#这就遇到了不少困难,当然了,困难虽然是暂时的,但总得去解决不是,只好通过不断地学习和总结来加深印象,夯实基础,争取厚积薄发。         封装、继承和多态是面向对象的三大特性,因此从C#的角度对这三大特性进行一个简单总结。         一、封装       首先封装相信大家都不会陌生了吧,就像看电视
C#基础------继承
一、继承的类型    1.结构总是派生自System.ValueType,它们还可以派生自任意多个接口;类总是派生自用户选择的另一个类,它们还可以派生自任意多个接口。using System; class Text :C//正确 {  } class t1:C,D//错误,C#只可以继承一个基类 {  } class t2 : A, B//正确,可继承实现多个接口 { } struct test...
C#基础 --继承
继承是在类之间建立一种相交的关系,使得新定义的派生类的实例可以继承已有的基类的特征并且还可以添加新的功能。以前对继承的理解仅仅限于定义,下面是我查了些资料、写了点代码的总结。 1.C#继承的特点 (1) 派生类是对基类的扩展,派生类可以添加新的成员,但不能移除已经继承的成员的定义。 (2)继承是可以传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中声明...
C#基础之继承
继承是面向对象程序设计的重要概念之一,先对继承进行综述。 1.继承的作用: 1)继承允许我们根据一个类来定义另一个类;这使得创建维护应用程序变得更加容易,同事也更有利于重用代码和节省开发时间; 2)继承后子类(派生类)拥有父类(基类)的一切属性(属性、方法、事件);继承实现了更大规模(类级别)的代码复用。 2.父类和子类的构造过程: 1)构造派生类时会先构造基类;也就是说调用派生类构造函