虚函数内存解析:派生类与基类内存布局

需积分: 10 2 下载量 119 浏览量 更新于2024-09-14 收藏 73KB DOC 举报
在计算机编程中,虚函数内存模型(Virtual Function Memory Model)是C++等支持多态性的面向对象编程语言中的一项关键特性。这个模型描述了派生类对象在内存中的布局以及虚函数如何影响其内存占用和行为。 首先,理解派生类和基类的关系是基础。当我们创建一个派生类(如`Class`、`CPoint`)时,该类除了包含自身的数据成员(如`Class`中的`void fun()`函数,`CPoint`中的`int m_ix`和`int m_iy`),还会继承基类的所有公有和保护成员。派生类的对象占据的内存空间等于它自身数据成员和基类所有成员的总和。 在C++中,如果在基类中声明了一个虚函数(如`virtual void fun()`),那么派生类的对象将不再直接访问这个函数的地址,而是通过虚表(Virtual Table,VTOR)来间接调用。每个派生类对象都有自己的虚表,其中包含了指向基类所有虚函数的实际实现的指针。这是为了实现动态绑定(Dynamic Binding),即在运行时确定调用哪个函数,而不是在编译时就固定。 程序4演示了这一点。当定义一个`Class`对象`objClass`时,输出显示`SizeofClass=4`,这可能是因为编译器为了实现虚函数的间接调用机制,额外预留了一定的空间用于存储虚函数指针。`AddressofClass`的值表明了这个对象在内存中的位置。 当我们增加多个虚函数(如`void fun1()`、`void fun2()`、`void fun3()`)时,虽然它们不会改变对象的大小,但虚表会相应地增加存储虚函数指针的条目。程序5的结果与程序4一致,说明即使虚函数数量增加,派生类对象的内存占用依然保持不变。 接着,程序6展示了派生自`CPoint`类的实例。`CPoint`中的`virtual ~CPoint()`函数被声明为虚函数,尽管在`main()`中没有直接使用,但它仍会被编译器纳入虚表。`SizeofClass`的输出表明,尽管`CPoint`没有显式数据成员,但由于虚函数的存在,它的大小仍然包含了必要的虚表空间。 总结来说,虚函数内存模型确保了派生类对象能够根据运行时的类型动态地调用基类的虚函数,而不会因为函数数量的增加而显著增大内存占用。这是一种灵活且强大的设计,对于实现多态性和代码的复用性至关重要。