老问题,继承,多态

wax19821022 2008-09-17 05:06:44
class Base
{
fn1{...};
virtual fn2{};
}

class Derived:Base
{
new fn1{...};
override fn2{...};
}

那么Derived实例化以后内存里面是什么样的啊?
比如说,有fn1,new fn1,Base.fn2,Derived.fn2之类的。谢谢
...全文
71 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2008-09-24
  • 打赏
  • 举报
回复
代码段里,会区分不同的类。实例化后,会再数据段分配空间,存放对象引用和成员变量,以及虚函数所用的指针。
sss0669 2008-09-23
  • 打赏
  • 举报
回复
base b=new base();
是 fn1 fn2没重写过的!
base b=new Derived();
是 fn1 fn2重写过的!
Derived b=new Derived();
就是 Derived的fn1 和 fn2 重写的
andyhooo 2008-09-23
  • 打赏
  • 举报
回复
关注。要理解这个多态继承问题,
cc_net 2008-09-17
  • 打赏
  • 举报
回复
那些地址是乱写的
cc_net 2008-09-17
  • 打赏
  • 举报
回复
BASE:
MethodDesc Table
Entry MethodDesc JIT Name
79371278 7914b928 PreJIT System.Object.ToString()
7936b3b0 7914b930 PreJIT System.Object.Equals(System.Object)
7936b3d0 7914b948 PreJIT System.Object.GetHashCode()
793624d0 7914b950 PreJIT System.Object.Finalize()
00a7c050 00a73068 JIT inherit.Base.fn1()
00a7c070 00a73098 JIT inherit.Base.fn2()


Derived:
MethodDesc Table
Entry MethodDesc JIT Name
79371278 7914b928 PreJIT System.Object.ToString()
7936b3b0 7914b930 PreJIT System.Object.Equals(System.Object)
7936b3d0 7914b948 PreJIT System.Object.GetHashCode()
793624d0 7914b950 PreJIT System.Object.Finalize()
00a7c050 00a73078 JIT inherit.Derived.fn1()
00a7c070 00a73098 JIT inherit.Derived.fn2()


你可以通过sos来调试查看方法表.
其中fn1的话,Derived中是不继承的,自己在方法表中创建了一个
fn2的话,因为是重写,虽然她继承了Base.fn2(),但是被从写指向了自己的Derived.fn2()

如果Base.fn1是virtual的话,那么在Derived中会继承
也就是有

00a7c040 00a73068 JIT inherit.Base.fn1()
00a7c050 00a73078 JIT inherit.Derived.fn1()
00a7c070 00a73098 JIT inherit.Derived.fn2()

有2个fn,但因为用了new,隐藏了父类的方法,Derived A = new Derived(),A.fn1()调用的是自己的Derived.fn2()
而Base A = new Derived(),A.fn1(),调用的是Base.fn1(),因为她是通过call [Derived方法表地址 +fn1在Base中位置]来找方法地址的.
而虚方法集成时,fn1的位置不不变的,也就是在方法表的第5行
lovehongyun 2008-09-17
  • 打赏
  • 举报
回复
new fn1
Derived.fn2

北京的雾霾天 2008-09-17
  • 打赏
  • 举报
回复
应该只有如下的两个成员(不包括从Object继承的):

new fn1
Derived.fn2

110,536

社区成员

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

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

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