定义一个父类跟子类:
public class Base
{
public virtual void f()
{
Console.WriteLine("Base.f()");
}
}
class Child : Base
{
public override void f()
{
Console.WriteLine("Child.f()");
}
}
在Main函数中的语句及其输出:
Base b = new Base();
Child c = new Child();
b = c;
b.f(); //输出为:Child.f()
(b as Child).f(); //输出为:Child.f()
(b as Base).f(); //输出为:Child.f()我的问题是: "(b as Base).f(); "中不是已经把b转换为父类的类型吗,为什么输出的还是子类中的函数?
public class Base
{
public virtual void f()
{
Console.WriteLine("Base.f()");
}
}
class Child : Base
{
public override void f()
{
Console.WriteLine("Child.f()");
}
}
在Main函数中的语句及其输出:
Base b = new Base();
Child c = new Child();
b = c;
b.f(); //输出为:Child.f()
(b as Child).f(); //输出为:Child.f()
(b as Base).f(); //输出为:Child.f()我的问题是: "(b as Base).f(); "中不是已经把b转换为父类的类型吗,为什么输出的还是子类中的函数?
解决方案 »
- 多线程问题
- 创建自定义的工程
- 对于二维List对象list,如何给第3行第2列的元素赋值,又如何取得第3行第2列的元素值
- 一个方法里面调用Button事件
- vs2005一启动调试时,就自动关闭了
- 不懂就问!
- 请问用datagrid做更新操作时,如何取得那一行的字段信息??
- 一个关于基于IE做数据统计的问题!(希望高手相助,高分相赠)
- 请教:2个不同工程下的窗体a和b,要想在a里点击一下按钮谈出b窗体,该怎么做?怎么引用?
- 如何用C#做web控件,以至网站如何调用!
- 在C#中,string str = null 与 string str = “” 的区别?
- 能不能用c#开发连接远程桌面将本地文件传输到服务器上?(送100分)
Base ba;
ba=b;
ba.f();
汗
因为b本来就是一个Child的实例,其其类的vmt已经被派生类修改了,所以vmt中的函数指向的是派生类的函数;
在
b = c;
后b所引用对象已经是Child了。
(b as Base)只是保证类型转换不会出现异常,不能改变b的类型,还是Child的。在调用方法是当然是调用Child.f()了
b = c; //此事b的实例也是Child类型的
对于Virtual/Override这种晚绑定(运行时决定绑定方法的类型)来说,引用是什么类型不重要,关键是看他的实例是什么类型的,这儿,实例是Child类型的,所以调的还是child的方法楼主要是有兴趣的话可以看看我在这个问题中的回答
http://topic.csdn.net/u/20090724/22/80702547-66ce-454f-b404-f406f5e5152e.html