public class A
{
public virtual void Func()
{
Console.WriteLine("Func In A");
} }
class B : A
{
public virtual void Func()
{
Console.WriteLine("Func In B");
} }
class C : B
{
public override void Func()
{
Console.WriteLine("Func In C");
}
}
执行代码如下:
A c = new C();
c.Func();
输出结果为:Func In A
为什么不是Func In C(难道C中方法不能重写A中虚方法吗?)编译器如何检查虚方法并执行相应的重写方法的呢?
{
public virtual void Func()
{
Console.WriteLine("Func In A");
} }
class B : A
{
public virtual void Func()
{
Console.WriteLine("Func In B");
} }
class C : B
{
public override void Func()
{
Console.WriteLine("Func In C");
}
}
执行代码如下:
A c = new C();
c.Func();
输出结果为:Func In A
为什么不是Func In C(难道C中方法不能重写A中虚方法吗?)编译器如何检查虚方法并执行相应的重写方法的呢?
解决方案 »
- winform为什么点右上角关闭的“差”后程序退出了,但任务管理器的进程里却显示呢
- 如何让主窗体FORM1和子窗体FORM2共同编辑一个变量?
- Asp.net c# web在本地win7 IIS和VS都可以运行,但是放到IIS运行无法查询到数据,数据是放在excel中的
- 用户自定义控件的问题
- sql2005,数据问题
- textBox控件mutiline属性改成true以后,能否设置每行的字体不同?
- 如何用事务对TableAdapter1.Update(DataSet)进行提交或回滚
- C#?迷茫中.....
- 菜鸟问题,.net可否编译成不需要运行时的软件!
- 在C#中应用XP风格图标(ico)的问题
- 如何去掉一维字符串数组s[]中的空元素行
- richTextBox中文字处理的两个问题
而B并没有重写A;
最后调用的是A的方法
那为什么把B中方法改为public override void Func()以后执行结果为Func In C
C重写B?但是B中没有指定虚方法啊?难道是继承自A,但是A中的方法不是被B的方法给覆盖了吗?我又试了下把B中方法去掉,结果为Func In C ,请你解释下原因。最好把编译器选择某个方法的流程说下,谢谢。
则把A中的FunC给隐藏了,所以对C来说,A中的方法是不可见的,也就不存在重写了,所以会调用A中的方法
因为B并没有重写A的FuncC方法,那么B实际上有两个FunC,一个是符合A规格接口的,另一个是符合B规格接口的,一共有两个。