首页 新闻 会员 周边

c#代码分析求解

0
[已解决问题] 解决于 2016-09-05 14:55

代码如下:

调用如下:

结果:

我的理解应该只有一次调用为什么会有两次调用,调用B类的方法,应该先是调用b的无惨构造方法给y赋值1,然后在调用B类中从写的OutputText方法,求解为什么有两次,求高人指点。

c#
坚持的阳光的主页 坚持的阳光 | 初学一级 | 园豆:86
提问于:2016-09-05 14:35
< >
分享
最佳答案
2

以下为 A a= new B(); 执行完成后输出:

在实例化子类B 的时候, 会按照继承顺序 实例化所有B的基类. 所以 new B() 执行的时候,首先执行A的构造函数,执行OutputText(), 但A的OutputText() 方法是虚方法,被B 重写, 所以 执行B的 OutputText() 方法, 输出第一句 x+y=0;

以下是a.OutputText();执行后输出:

调用B的OutputText() 方法 输出 第二句 x+y=1.

奖励园豆:5
朝兮兮 | 初学一级 |园豆:69 | 2016-09-05 14:42
其他回答(4)
0

因为B是继承自A,所以在进行B的构造函数之前会先走A的构造函数,你可以用VS加断点调试一下,一步一步跟着程序走走试试。我给你调试看看。。。我也是个新手

帆帆帆 | 园豆:134 (初学一级) | 2016-09-05 14:41
0

你这个定义的对象a是指向子类的,调用的时候会先调用父类的无参构造函数,然后再调用子类的无参构造函数,最后调用子类的outputText方法(为什么调用子类的方法你应该知道吧)

一直乱跑的熊 | 园豆:204 (菜鸟二级) | 2016-09-05 14:42
0

语法常识1:一个类在生成实例时.总会执行某一个构造函数.不执行构造函数就没有实例

吴瑞祥 | 园豆:29449 (高人七级) | 2016-09-05 14:46
0

从调试中可以看到是调用了两次输出,第一次x,y的值均为0,然后调用了一次输输出函数,当程序第二次进入B类后y的值为1,再次调用了override的方法,输出x+y的值为1,所以最后输出了2次,你调试一下,看看能明白不?

 

已无灵感 | 园豆:202 (菜鸟二级) | 2016-09-05 15:03

但是还有一点不明白的就是,子类继承父类,在new的时候要调用父类的构造函数,但是在调用父类的构造函数时候,当构造函数调用方法的时候,为什么调用的是子类重写的方法不是父类的方法了,是不是在new的时候就以及把父类的方法替换了。

支持(0) 反对(0) 坚持的阳光 | 园豆:86 (初学一级) | 2016-09-05 15:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册