oop - 多态期间内存会发生什么?

标签 oop memory language-agnostic

我一直想知道,当你将一个对象指针转换为它的基类时,内存到底发生了什么?我假设存储子类中所有成员函数和变量的内存仍然存在,现在只是“禁区”。这是正确的吗?如果是这样,抽象/虚拟函数如何工作?在这种情况下,如何从基类指针调用子类实现?

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

私有(private)、 protected 甚至虚拟继承之类的东西是如何与此相关的?

最佳答案

您要问的是实现细节。
一般而言,通常的方法是将指向函数指针表的指针存储为对象的一部分(函数不是实际对象内存占用的一部分),并根据具体对象此表(C++ 中的 vtable,一些我想像 Java 中的类似结构)指向实际运行时对象的方法,因此您使用指向基类的指针这一事实不会影响您实际调用派生覆盖的方法类

And how do things like private, protected and even virtual inheritance work in relation to this

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

关于oop - 多态期间内存会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13000107/

相关文章:

使用指针发送数组的C项目

java - 在 Java 中原子读取然后写入 ByteBuffer 的一部分

algorithm - 在没有循环的情况下计算给定数字的负二进制表示

javascript - 如何实现多项目选择?

kotlin - 在 Kotlin 中,我可以在集合上添加条件构建器元素吗?

oop - 如何发出用例结束的信号?

java - 查找二维数组中项目的索引

javascript - 如何专门化一个 Javascript 类?

c - 有趣的内存钩中的符号

algorithm - 桶排序和基数排序有什么区别?