gpt4 book ai didi

c# - 将派生类对象分配给父类引用

转载 作者:太空狗 更新时间:2023-10-29 22:53:55 24 4
gpt4 key购买 nike

看到的时候总是不解:

Parent ref = new Child();

子类扩展父类的地方。

  1. 对象 ref 在内存中是什么样子的?
  2. 如何处理虚拟方法?非虚拟?
  3. 它与以下内容有何不同:
Child ref = new Child();

最佳答案

How does the object look in memory?

你的问题不清楚。有两个相关的内存位置。 变量 与存储位置相关联。该存储位置包含对另一个 存储位置的引用

变量的存储位置通常实现为包含“托管指针”的四字节或八字节整数——垃圾收集器已知的内存地址。

对象的内存布局也是CLR的一个实现细节。与对象关联的内存缓冲区将包含该对象的所有数据——字段的所有值等等。它还包含对另一个 内存位置的引用,即对象的虚函数表

虚函数表 (vtable) 然后包含甚至更多的引用,这次是引用与对象的最派生类型关联的方法。

How is virtual method treated? non-virtual?

虚方法的执行方式是从变量中查找对象引用,然后查找 vtable,然后在 vtable 中查找方法,然后调用该方法。

非虚拟方法不会通过 vtable 调用,因为它们在编译时已知。

How is it different from...

在对象上调用的非虚拟方法将根据变量 的类型调用方法的版本。在对象上调用的虚拟方法将根据变量引用的对象 的类型调用方法的版本。

如果这还不是很清楚,您可能想阅读我的文章,其中解释了如何用一种没有虚方法的语言“模拟”虚方法。如果您能够理解如何用一种没有虚拟方法的语言自己实现虚拟方法,那将有助于您了解我们实际上是如何实现虚拟方法的。

http://blogs.msdn.com/b/ericlippert/archive/2011/03/17/implementing-the-virtual-method-pattern-in-c-part-one.aspx

关于c# - 将派生类对象分配给父类引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390945/

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