2012-10-21 53 views
2

我一直在想,当你将一个对象指针指向它的基类时,内存到底发生了什么?我认为存储在子类中的所有成员函数和变量的内存仍然存在,现在只是“禁止”。这是正确的吗?如果是这样,抽象/虚拟功能如何工作?在这种情况下,如何从基类指针调用子类实现?多态性过程中记忆会发生什么?

另外,这取决于语言会有所不同吗?很显然,C++使用堆栈和堆,而Java只会使用堆。这是否意味着多态关系的内存处理方式不同?

而私人的,受保护的甚至是虚拟继承的事情是如何工作的?

回答

5

你在问什么是实现细节。从广义上讲,通常的做法是将指向函数指针表的指针作为对象的一部分存储(这些函数不是实际对象的内存占用的一部分),并且根据具体对象(C++中的vtable)在Java我想象)类似的结构指向实际运行时对象的方法和结果的事实,你正在使用一个指向基类没有从实际调用由派生类重写的方法会影响你

而像私人,受保护甚至是虚拟继承 这样的事情是如何工作的

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