• c++多继承布局


    1:多重继承

    对于一个继承了多个base class 的对象,将其地址指定给最左端(也就是第一个)base class的指针,
    情况将和单一继承时相同,因为两者都指向相同的其实地址。至于第二个或者更后面的base class的
    地址指定操作(把derived class对象地址 赋给 第二个base class类型的指针),则需要将地址修改
    加上,介于中间的base class subobject(s)大小
    如果有这样的继承关系

    这里写图片描述
    则布局情况

    2:虚拟继承

    虚拟继承

    一般的布局策略是先安排好derived class 的不变部分,然后再建立其共享部分
    如何存取class 的共享部分呢?
    可以选择在derived class object中安插一些指针,每个指针指向一个vrtual base class,通过
    间接存取的方式完成存取。
    void Point3D:: operator+= (const Point3d &rhs)
    {
    _x += rhs._x;
    _y += rhs._y;
    _z += rhs._z;
    }
    可以被转换成这样:
    __vbcPoint2d->_x += rhs.__vbcPoint2d->_x;
    __vbcPoint2d->_y += rhs.__vbcPoint2d->_y;
    _z += rhs._z;

    Point2d *p2d = pv3d;
    Point2d *p2d = pv3d ? pv3d->__vbcPoint2d : 0;
    这样做的缺点很明显:
    1. 每个对象必须针对每个virtual base class 添加一个额外的指针,这样virtual base class
    越多,object负担越重。也就是负担不固定。
    解决办法1:
    引入一二virtual base class table。每个virtual base class都会由编译器安插一个指针
    指向virtual base class table。真正的virtual base class 指针,被放在table中。也就是table中存放
    了所有的virtual base class 的指针。每次要访问直接从virtual base class table中找到相应基类
    解决办法2:
    和virtual function table 放在一起,但是virtual base class存放在索引为负的地方,并且只存放偏移
    根据object的基址以及取得的偏移就可以找到object中的virtual base class了。
    2. 由于虚拟继承串链的加长,会导致间接存取的层次增加,也就是你想取得从一个 虚拟继承来的基类
    的 他的虚拟继承的基类 的成员,就需要两次间接访问,层次越多,访问越慢。
    解决办法:
    把所有的virtual base class 的指针都放置在derived class object中,也就是原本需要两次间接操作的
    现在我们把那个第二次间接操作需要的指针直接放在derived class object中去
    这是vs2013的虚拟继承的布局。
    这里写图片描述
    然后还有超级复杂的终极版本:
    这里写图片描述

  • 相关阅读:
    Git
    Entropy, relative entropy and mutual information
    2021.5.3 团队冲刺第六天
    2021.5.2 团队冲刺第五天
    2021.5.1 团队冲刺第四天
    2021.4.30 团队冲刺第三天
    2021.4.29 团队冲刺第二天
    2021.4.28 团队冲刺第一天
    2021.4.27
    2021.4.26
  • 原文地址:https://www.cnblogs.com/boydfd/p/4983104.html
Copyright © 2020-2023  润新知