C# new关键字隐藏基类virtual方法
时间:2011-12-14
来源:互联网
代码如下:
internal class Base
{
public virtual void Do()
{
Console.WriteLine( "This is base method" );
}
}
internal class Derived : Base
{
public new virtual void Do()
{
Console.WriteLine( "This is the derived class's hidden method!" );
}
}
Base b = new Derived();
b.Do();
输出:This is base method
可是按照CLR运行机制:在调用虚实例方法时,首先检查发出调用的变量,然后跟随地址来到发出调用的对象,代码检查对象内部的“类型对象指针”,它指向对象的实际类型,然后,代码在类型对象的方法表中查找引用了被调用方法的记录项,接着调用方法。
按照这个理论上应该输出This is the derived class's hidden method!才对,或者因为使用了隐藏方法,派生类的方法表有什么特殊之处?
求解!
internal class Base
{
public virtual void Do()
{
Console.WriteLine( "This is base method" );
}
}
internal class Derived : Base
{
public new virtual void Do()
{
Console.WriteLine( "This is the derived class's hidden method!" );
}
}
Base b = new Derived();
b.Do();
输出:This is base method
可是按照CLR运行机制:在调用虚实例方法时,首先检查发出调用的变量,然后跟随地址来到发出调用的对象,代码检查对象内部的“类型对象指针”,它指向对象的实际类型,然后,代码在类型对象的方法表中查找引用了被调用方法的记录项,接着调用方法。
按照这个理论上应该输出This is the derived class's hidden method!才对,或者因为使用了隐藏方法,派生类的方法表有什么特殊之处?
求解!
作者: Qiyeye 发布时间: 2011-12-14
这里的代码是在故意制造混乱。同时这也是一个需要紧扣概念的问题
当将一个派生类形的对象赋于一个基类型的引用时
1、如果调用的方法是被派生类型重写的,则调用派生类形的方法 (此处不满足,因为Derived并非重写父类同名方法)
2、不满足上述情况的调用,则调用基类的方法。
其实这里的new(故意隐藏父类同名成员)只是故意制造混淆的。
如果将Derived的Do方法,改写为重写父类的方法,则结果会显示
This is the derived class's hidden method!
当将一个派生类形的对象赋于一个基类型的引用时
1、如果调用的方法是被派生类型重写的,则调用派生类形的方法 (此处不满足,因为Derived并非重写父类同名方法)
2、不满足上述情况的调用,则调用基类的方法。
其实这里的new(故意隐藏父类同名成员)只是故意制造混淆的。
如果将Derived的Do方法,改写为重写父类的方法,则结果会显示
This is the derived class's hidden method!
作者: chromeV8 发布时间: 2011-12-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28