c++对象模型( 三 )


offset策略
在虚函数表中放置虚基类的offset.

c++对象模型

文章插图
 
Function语义学
虚函数
基类的指针或者引用寻址出一个子类对象 , 虚函数分配表格索引 , vptr指向virtual table, virtual table中存放虚函数指针.
inline函数
inline是一个请求 , 编译器解说就必须认为它用一个表达式合理的将这个函数扩展开来 , 扩展期间使用实参代替形参 , 局部变量在封装的区域内名字唯一.
函数的调用方式
  1. 非静态成员函数
  2. 改函数签名安插this指针 , 变为一个非成员函数 , 可以使类对象调用.
  3. 调用对非静态成员的存取有this指针完成
  4. 通过name-maping 改为一个外部函数
float Point3d::getX()const{...}extern getX_Point3dFv(const Point3d* this)obj.getX()等价于 getX_Point3dFv(&obj)ptr->getX()等价于getX_Point3dFv(ptr)
  1. 静态成员函数 被转为非成员函数 , 不能访问非静态成员没有this指针
  2. 虚成员函数 (*ptr->vptr[1])(ptr) 通过拿到徐表中虚函数地址传入this指针来调用
构造、拷贝、析构语义学
构造函数的扩充
顺序: 先父类后成员最后自己的调用方式.
vptr的初始化在所有base 类构造之后 , 初始化列表之前(程序代码)
  1. 虚基类的构造函数被调用从左到右从深到浅
  2. 基类的构造函数被调用 , 按照基类的生命顺序
  3. 设置vptr的指针初值 , 初始化虚函数表
  4. 成员函数的初始化列表被放在构造偶函数内部以成员类的声明顺序,么有构造函数则调用合成的默认的构造函数
  5. 构造自己 , 执行user code
析构函数
按照上面相反的顺序调用 先自己析构然后类成员对象析构然后重置vptr然后基类析构然后虚基类析构
拷贝构造
拷贝构造函数和拷贝复制运算符




推荐阅读