gpt4 book ai didi

c# - 继承中的方法调用

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:14 26 4
gpt4 key购买 nike

让我们假设我有一个父类和一个子类,并且我重载了其中一个父类方法。

我正在将子类对象分配给 PARENT CLASS 引用变量。我知道,当我尝试调用父类方法时,它会调用子类方法。

但这背后的原因是什么?什么是程序控制流程?堆内部发生了什么?

最佳答案

这里的“魔法”是查找表。

当您将方法声明为虚拟时,该方法将被添加到一个链接到该类型的表中,所有对该方法的调用都将在该表中查找要调用的方法的地址。

因此,不是在对特定地址的特定方法的调用中进行编译,而是将调用编译为查找,然后调用从表中检索到的值。

例如,假设基本类型有这个表:

[1000]

对于第一种类型,所讨论的方法位于地址 1000。

对于第二种类型,此表如下所示:

[2000]

相同的(覆盖的)方法现在位于地址 2000。

如果方法不是虚拟的,调用它,就像这个调用:

baseObject.Method1();

会被编译成这样:

call method at address 1000

但现在它看起来像这样:

get address to type virtual method table (vtable)
get adress from index 0 in the table
call the method at that address

关于c# - 继承中的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30975224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com