C++对象模型(2)---对象模型中加入单继承

本文详细探讨了C++中的对象模型,包括简单对象模型和表格驱动模型的特点与区别。介绍了不同继承方式(如单继承、多继承、虚继承)如何影响派生类对象的结构布局,并通过具体代码示例展示了重写与非重写情况下派生类对象的虚函数表变化。

原文链接:吴秦大神的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不是虚继承,所以是扩充已存在的虚函数表,所以结构如下图所示:

clip_image015[3]


有重写的单继承

派生类中重写了基类的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()函数在虚函数表中表现如下:

clip_image020[3]


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值