还是不明白 大家帮帮忙啊

yangjinqiang 2008-10-12 10:34:21
using System;
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
这个程序中的最后两句在vs中单步执行的时候不明白它的执行顺序,望高人指点。
...全文
62 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunshine_anycall 2008-10-12
  • 打赏
  • 举报
回复
2
1
这回是多态的问题
上次是初始化顺序的问题
sunshine_anycall 2008-10-12
  • 打赏
  • 举报
回复
这个问题不是问过了吗?
abcyzq 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shanying_0 的回复:]
这个问题好饶呀。编程的时候有必要这么饶么。简单明了点不好么?自己好读,别人也好读,大家都好读!!!
貌似多太也不要这么用把!!!!会用并不代表是滥用!!!
[/Quote]

呵呵,楼主还是概念没理解清楚,3楼很详细。
这个是要花点时间才能想明白,有一天你顿悟了,这么饶也冒问题。
shanying_0 2008-10-12
  • 打赏
  • 举报
回复
这个问题好饶呀。编程的时候有必要这么饶么。简单明了点不好么?自己好读,别人也好读,大家都好读!!!
貌似多太也不要这么用把!!!!会用并不代表是滥用!!!
brallow 2008-10-12
  • 打赏
  • 举报
回复
多太的问题,我想有以下几个原则:
1:对于虚函数,是以对象的实际类型为基准调用;
2:对于非彪炳函数,是以“调用时”“声明”的类型为基准调用。

经上面的代码为例:
在Main函数中:
a.Fun2(b);
对于对象a,它是A类型,Fun2是非虚函数,所以它将将执行Fun2(b);
这个函数中有两个函数调用:
public void Fun2(A a) 
{
a.Fun1(1);
Fun1(5);
}

对于这一次调用,对应形参(A a),传入的实参是B b,也就是说在这个Fun2中,a实际上是B类型的对象作为A类型来使用。
那么对于第一个函数调用:
a.Fun1(1);
由于Fun1是一个虚函数,所以它将调用a对象实际类型的Fun1,也就是b.Fun1()。

其它的以此类推……HOHO。

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧