我一直想知道,当你将一个对象指针转换为它的基类时,内存究竟发生了什么?我认为存储子类中所有成员函数和变量的内存仍然存在,现在只是“禁止”。这是正确的吗?如果是这样,抽象/虚拟功能如何工作?为什么在这种情况下可以从基类指针调用子类实现?
另外,它会根据语言而有所不同吗?显然,C ++使用堆栈和堆,而Java只使用堆。这是否意味着多态关系的内存处理方式不同?
私有,受保护甚至虚拟继承等事情如何与此相关?
答案 0 :(得分:5)
您要问的是实施细节
从广义上讲,通常的方法是存储一个指向函数指针表的指针作为对象的一部分(函数不是实际对象的内存占用的一部分)并且取决于具体对象这个表(C ++中的vtable ,我想象的Java
中的一些类似的构造指向实际的运行时对象的方法,因此你使用指向基类的指针的事实不会影响你实际调用派生类重写的方法
如何做私事,受保护甚至虚拟继承 与此相关的工作
这与您的问题无关。修饰符(公共/私有/受保护)是静态时间构造。即编译器根据修饰符强制使用。底层记忆在这里是无关的。
答案 1 :(得分:4)
通常情况下,记忆中什么都没发生。该转换只会影响程序中使用它的指针的使用方式。
检查此链接是否有关如何实施的更多信息: http://en.wikipedia.org/wiki/Virtual_method_table