原文链接:吴秦大神的C++对象模型
不管是单继承、多继承,还是虚继承,如果基于“简单对象模型”,每一个基类都可以被派生类中的一个slot指出,该slot内包含基类对象的地址。这个机制的主要缺点是,因为间接性而导致空间和存取时间上的额外负担;优点则是派生类对象的大小不会因其基类的改变而受影响。
如果基于“表格驱动模型”,派生类中有一个slot指向基类表,表格中的每一个slot含一个相关的基类地址(这个很像虚函数表,内含每一个虚函数的地址)。这样每个派生类对象汗一个bptr,它会被初始化,指向其基类表。这种策略的主要缺点是由于间接性而导致的空间和存取时间上的额外负担;优点则是在每一个派生类对象中对继承都有一致的表现方式,每一个派生类对象都应该在某个固定位置上放置一个基类表指针,与基类的大小或数量无关。第二个优点是,不需要改变派生类对象本身,就可以放大,缩小、或更改基类表。
不管上述哪一种机制,“间接性”的级数都将因为集成的深度而增加。C++实际模型是,对于一般继承是扩充已有存在的虚函数表;对于虚继承添加一个虚函数表指针。
无重写的单继承
无重写,即派生类中没有于基类同名的虚函数。
#include "base.h"
class Derived : public Base {
public:
Derived(int);
virtual ~Derived();
virtual void derived_print(void);
protected:
int iDerived;
};
Base的模型跟上面的一样,不受继承的影响。Derived不是虚继承,所以是扩充已存在的虚函数表,所以结构如下图所示:
有重写的单继承
派生类中重写了基类的print()函数。
#include "base.h"
class Derived_Overrite :public Base{
public:
Derived_Overrite(int);
virtual ~Derived_Overrite();
virtual void print(void) const;
protected:
int iDerived;
};
重写print()函数在虚函数表中表现如下:
本文详细探讨了C++中的对象模型,包括简单对象模型和表格驱动模型的特点与区别。介绍了不同继承方式(如单继承、多继承、虚继承)如何影响派生类对象的结构布局,并通过具体代码示例展示了重写与非重写情况下派生类对象的虚函数表变化。
![clip_image015[3] clip_image015[3]](https://i-blog.csdnimg.cn/blog_migrate/c7b0a059894e134b4b266e636790fd9b.png)
![clip_image020[3] clip_image020[3]](https://i-blog.csdnimg.cn/blog_migrate/dd1b364cea1c4b3f87240042d8126993.png)
544

被折叠的 条评论
为什么被折叠?



