多态性期间记忆会发生什么?

use*_*369 2 language-agnostic memory oop

我总是想知道,当你将一个对象指针转换为它的基类时,内存究竟发生了什么?我认为存储子类中所有成员函数和变量的内存仍然存在,现在只是"禁止".这是正确的吗?如果是这样,抽象/虚拟功能如何工作?为什么在这种情况下可以从基类指针调用子类实现?

此外,它是否因语言而异?显然,C++使用堆栈和堆,而Java只使用堆.这是否意味着多态关系的内存处理方式不同?

那些私有,受保护甚至虚拟继承之类的东西如何与此相关?

Cra*_*lus 5

您要问的是实施细节.
一般来说,通常的方法是存储一个指向函数指针表的指针作为对象的一部分(函数不是实际对象的内存占用的一部分)并且取决于具体对象这个表(在C++中的vtable,一些类似的构造)在Java我想象中)指向实际运行时对象的方法,因此您使用指向基类的指针不会影响您实际调用派生类重写的方法

而私有,受保护甚至虚拟继承等方面如何与此相关

这与您的问题无关.修饰符(public/private/protected)是静态时间构造.即编译器根据修饰符强制使用.底层内存在这里是无关的.