公司动态
c++对象模型--补充
1.多态的实现通过基类指针或引用调用基类虚函数。上述(*pointer).rotate();也会触发多态。2.构造中必须解决事情基类构造非静态类型成员构造不含基础类型指针类型虚表指针存在虚表时虚基类处理存在虚基类时针对自行定义构造中未提供部分编译器负责将上述4项中缺失部分补全。classBase{public:virtualvoidfun(){printf(fun_base\n);}};classD:publicB{public:virtualvoidfun(){printf(fun_D\n);}};intmain(){Base b;D d;// 此语句会引发Base的拷贝构造拷贝构造中会让b中虚表指针指向Base的虚表编译器自动处理bd;// 无多态效果。因为编辑器在Base拷贝构造中对虚表指针操作后使然。单纯的内存拷贝无法让多态失效。b.fun();}3.虚基类继承语言支持virtual base class时会导致一些额外的负担。在derived class中这个额外负担反映在某种形式指针上或者指向virtual base class subobject或者指向一个相关表格表格中要么存virtual base class subobject的地址要么其偏移。32位机器上一种可能布局32位机器上另一种可能布局理念是空类额外增加一字节是为了区分此类不同实例拥有虚基类的派生类即使不含派生成员也必然包含某种设置指向虚基类子对象故无需额外添加1字节。对A的内存布局一种常见安排// 假设64位程序-------------Y中指向虚基类凭据8字节-------------Z中指向虚基类凭据8字节-------------A派生部分为空考虑对齐后64位编译下sizeof(A)可能是16。若A中包含派生成员假设包含一个int i;对A的内存布局一种常见安排// 假设64位程序-------------Y中指向虚基类凭据8字节-------------Z中指向虚基类凭据8字节-------------A的成员int(4字节)------------空公共虚拟基类(1字节)考虑到对齐后sizeof(A)可能是24。一旦 A 有了自己的数据成员X 作为独立的虚基类子对象必须有一个可区分的地址不能再被完全优化掉因此需要分配 1 字节加上 3 字节填充对齐。