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