图1
如果还有另一个派生类 "Derived" 继承了基类"Base".那么内存分布将如下图所示: 图2
子类对象和父类对象拥有同样的内存分布,当然,子类对象需要更多的空间来存放新的属性域. 这种分配方式的好处在于 Base类型的指针 如果指向了子类Derived的对象, 依然在开头的地方"看见"Base对象. 因此, 子类对象(Derived)采用 父类引用(Base) 来进行的操作 保证是安全的,因此在运行时不需要动态地检查 Base 引用的实际类型. 用样的道理,方法也可以放到object空间的开始处,如下图所示. 图3
然而这种实现方式是没有效率的.假若一个类有很多方法(例如20个),那么每个对象就要持有20个指针,相应的,每个对象都需要20个指针的内存空间,这会导致创建对象变慢,所占空间更大。 优化手段是创建一个 虚拟函数表(vtable,虚表),虚表是一个指向特定类的成员函数的指针数组. 如下图所示: 图4
* 以上是我对斯坦福大学编译器讲座所做的笔记,该讲座非常生动有趣。 参考文献: 1. 2. 相关文章: