C#的一个关于继承很基础但又很让我不解的问题。。。

问题描述

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方法

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

解决方案

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

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

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

解决方案二:

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

时间: 2024-08-29 14:37:25

C#的一个关于继承很基础但又很让我不解的问题。。。的相关文章

java-Java一个很基础的面试题【求助】

问题描述 Java一个很基础的面试题[求助] public class Apple extends Fruit { private String name = "apple"; public Apple () { tellName(); printName(); } public void tellName() { System.out.println("Apple tell name: " + name); } public void printName() {

java 关于扩展类 很基础的一个 刚接触java求指导

问题描述 java 关于扩展类 很基础的一个 刚接触java求指导 已经有了一个类 public class Person{ } 之后又有一个Person类的扩展类Student类 那么在 eslipse中编写程序时 是有两个类 对吧?那扩展类Student需要如何创建这个类啊? 解决方案 首先在eclipse中新建两个类,在其中一个类中写main方法写测试代码.测试要依据你的需求看怎么测了. 解决方案二: public Student extends Person{ //extends继承 }

字符串-一个很基础的返回值问题

问题描述 一个很基础的返回值问题 想要打印字符串数组,去掉中间的空格和Tab,并且删除全为空的行,哪里有错?谢谢. #include #define MAXLINE 1000 int getline(char line[], int maxline); int copy(char to[],char from[]); int main(){ int len; int max; char line[MAXLINE]; max=0; while ((len=getline(line,MAXLINE)

java 继承-一个java继承中碰到的菜鸟问题

问题描述 一个java继承中碰到的菜鸟问题 public class Parent { public String a; public String b; public Parent getA(){ System.out.println("PPPPPPPPP"); return this; } public void Test(){ System.out.println(getA().a); System.out.println(getA().b); } } public class

Mini-Mesos:一个Mesos的测试基础框架

本文讲的是Mini-Mesos:一个Mesos的测试基础框架,[编者的话]Mini-Mesos建立在思科Intercloud服务与Container Solutions服务合作的基础上,它是基于 Apache License 2.0版本下的开源项目.本文主要介绍了在容器解决方案与极限编程(XP)之间所存在的一些联系,以及如何在发展集容器化应用和Mesos框架的同时还开展TDD的核心XP实践和持续集成,介绍了用于构建Mesos框架的测试工具Mini-Mesos. 大多数人知道我是通过极限编程(XP

混合云需要一个怎么样的存储基础?一起来看看IBM如何应对!

人们一直希望能够像利用像水.电资源一样来利用IT资源.这也是云计算能快速发展的原因.但是就像人们的需求不同,有工业用水和生活用水,而生活用水中有人喜欢喝热水,有人喜欢喝瓶中水等等.围绕水资源产生的商业价值圈就慢慢形成并成熟起来. IT资源的进化同样如此,从传统的IT架构到超融合系统,从私有云到公有云在到混合云.实践出真知,经过IT技术的发展和企业的不断应用.IBM 商业价值研究院给出的调研数据,今天80%的企业对于公有云的服务呈现上升趋势.由于很多公司仍希望将一些数据保存在内部,混合云可帮助他们

java-小弟想请教一个问题.对于大神们来说很简单

问题描述 小弟想请教一个问题.对于大神们来说很简单 小弟的这个程序很简单 但是对于小弟来说实在是太难了 本来前面的已经实现了,但是算总分的时候第二个人的成绩总是要和第一个成绩相加,这是程序这是运行后的结果就想问问大神怎么做把两个人的总分成绩分开 求大神帮帮忙哈 解决方案 zhongfen[i]=bianliang; 下一行加上 bianliang=0; 解决方案二: 变量 bianliang 在每次输入学生姓名是清零.

系统架构-做为一个没有任何编程基础菜鸟,怎样实现数据的采集,监测分析,然后存入数据库?

问题描述 做为一个没有任何编程基础菜鸟,怎样实现数据的采集,监测分析,然后存入数据库? 由于导师想让做一个 旋转机械的振动状态监测与故障诊断系统 出来,做为一个没有任何编程基础的菜鸟,怎样实现数据的采集,监测分析,然后存入数据库? 由于是零基础,请问大家我需要学习哪方面的东西? 导师说 让用C++Builder进行开发,具体需要重点掌握CB里的哪些东西啊?非常感谢! 解决方案 掌握 C++Builder,这个只是工具.如果对其它的开发工具有兴趣,也可以考虑. C++Builder 现在用的人比较

android studio-AS怎么创建一个有继承父类的类??

问题描述 AS怎么创建一个有继承父类的类?? 在eclipse中建立class有supperclass选项 但是android studio里中没有supperclass这个选项.如图所示,那么我想要在AS里创建一个有继承父类的类要怎么创建??? 解决方案 这么久了,还是没人回答,,,同问 解决方案二: 不能,只能手动extends继承