早教吧作业答案频道 -->其他-->
关于C#虚函数的问题希望高手指教,不要搜索来的大堆资料,那些都看过了。谢谢。虚函数用来实现在派生类中对方法的重写。但是使用new修饰符一样可以达到这个效果呢。比如:class
题目详情
关于C# 虚函数 的问题希望高手指教,不要搜索来的大堆资料,那些都看过了。 谢谢。 虚函数用来实现在派生类中对方法的重写。 但是 使用new修饰符一样可以达到这个效果呢。 比如: class BaseClass { public void NVMeth() { Console.WriteLine("调用了基类BaseClass的NVMeth"); } public virtual void VMeth() { Console.WriteLine("调用了基类BaseClass的VMeth"); } } class InClass : BaseClass { new public void NVMeth() { Console.WriteLine("调用了派生类InClass的NVMeth"); } public override void VMeth() { Console.WriteLine("调用了派生类InClass的VMeth"); } } 两种方法都实现了对基类方法的调用,那么他们有什么区别呢。虚函数的存在意义在于哪点呢。 主函数中如果这样 InClass InObj = new InClass(); BaseClass BaseObj = InObj; BaseObj.NVMeth(); BaseObj.VMeth(); 得到的结果是: 调用了基类BaseClass的NVMeth 调用了派生类InClass的VMeth 书上关于这个的解释是: 由于运行时多态,执行语句InClass InObj=new InClass();时产生的对象InObj中已有虚方法的代码,执行语句BaseClass BaseObj=InObj;时虚方法代码一起赋值给了BaseObj变量。 那么为什么 NVMeth 的代码没有一起赋值给BaseObj变量呢 ?
▼优质解答
答案和解析
如果你有一定c++基础,知道指针含义,和对象在内存中的分配状况就很容易理解了 对象在new的时候会在内存的堆。他的结构就像下面 InClass InObj = new InClass(); inobj---->内存堆中的一个指针 对象函数表 //对象函数表,每一个对象都有一个对象函数表,已标示对象的每个方法函数的入口地址 方法NVMeth()相对头部偏移xx距离 方法VMeth() 相对头部偏移 虚函数VMeth() 重载,实际上是把VMeth() 相对头部偏移的那个量给改动了 方法NVMeth()没有被重载所以那个偏移量还是原来的 BaseClass BaseObj = InObj; 这里发生转换,因为引用对象,所以实质是把对象的指针传给了BaseObj,但是他的函数表还是inobj的函数表 因为方法NVMeth()相对头部偏移没有改变,所以系统找到了基类的函数,而 方法 VMeth() 由于被重载了所以他的那个偏移量变了,所以他找到的是修改后的函数入口 我这里讲的有关对象的底层实现机制,需要有一定c++知识才看的明白,如果你看不懂的话 请参考下面几本书 《c和指针》该书已绝版,不过网上有电子版可以看 《深入c++对象模型》 《深入浅出mfc》的前面几章有关mfc中对象实质部分
看了关于C#虚函数的问题希望高手指...的网友还看了以下:
帮忙写一篇英语作文要自己写的,不要求全对但是也别错的太多,用英语简要描写你的一位好友李华1年龄16 2020-05-13 …
英语翻译我喜欢他的主持才能,幽默又充满朝气;喜欢他的音乐,轻松又自由;喜欢他的博学,精通多门语言. 2020-05-14 …
谁能帮我想几个和“大器晚成”相似的成语如题,80分聊表谢意,分不高,但还是盼望大家给出多多的答案等 2020-06-04 …
电饭煲煮开水后停电,将煲胆拿出来,煲底散热快,还是留煲胆在煲处,让水不停沸腾煲底散热快?我认为不拿 2020-06-19 …
虽然我个子不高,但我有一副宽厚的肩膀虽然我没有钱,但是我有一颗爱你的心虽然--但--大家在帮我想点 2020-06-22 …
为什么普罗旺斯纬度虽不高,但是晚上十点才天黑?当地时间现在时节是2010年8月初,有个朋友去法国南 2020-06-23 …
炼钢冶炼过程中铁水S不高,但终点S高是怎么回事 2020-07-10 …
一篇100个单词左右的高中英语作文(语言要尽可能简单)Mybestfriend作文里必须包括以下内容 2020-11-05 …
英语会读会理解水平不高但句子会读也可以理解但是书本一合上要想个句子来说就很伤脑筋了对语法也一知半解有 2020-11-26 …
求推荐点.不要功利.完全是兴趣.闲暇看着玩的,本人高中毕业生,不高.但是比平均高中数学还是高不少的. 2020-12-14 …