2

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

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

以及诸如私有、受保护甚至虚拟继承之类的东西是如何与此相关的?

4

2 回答 2

5

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

以及诸如私有,​​受保护甚至虚拟继承之类的事情如何与此相关

这与您的问题无关。修饰符(公共/私有/受保护)是静态时间构造。即编译器根据修饰符强制使用。底层内存在这里无关。

于 2012-10-21T17:11:51.293 回答
4

通常,内存根本不会发生任何事情。强制转换只会影响程序中使用它的任何其他人如何使用指针。

查看此链接以获取有关如何实施的更多信息: http ://en.wikipedia.org/wiki/Virtual_method_table

于 2012-10-21T17:12:34.510 回答