Liny_@NotePad

沉迷ACG中

【20090821】C++培训日记-虚函数表

检测方法(VS2005):项目命令行加上参数/d1reportAllClassLayout,在编译时CTRL+F5搜索输出,查看类的对象布局。

vftable - 虚函数表; vbtable - 虚继承的父类表; member - 类的成员变量(这个只是写作方便说明 = =)。

总结:

  • 继承方式:非virtual继承:导入各个父类的结构(按照父类声明的顺序,从上到下),自身member在最后
    • 重写virtual方法:更新该方法最早定义的类的vftable
    • 新的virtual方法:在最左父类的vftable增加
  • 继承方式:有virtual继承:在自身member后增加virtual父类的结构(按照子类继承的顺序从左到右),同时在最前面增加vbtable(如果没有的话),增加一项指向父类结构
    • 重写virtual方法:更新该方法的最早定义的类的vftable
    • 新的virtual方法:在自身最前面增加vftable(如果没有的话),在自己的vftable增加

C++对象布局及多态实现的探索

系列文章:http://c.chinaitlab.com/special/dxdtbj/Index.html

(一)前言:http://c.chinaitlab.com/cc/basic/200906/787895.html
普通类对象:http://c.chinaitlab.com/cc/basic/200906/787895_2.html
普通继承类对象:http://c.chinaitlab.com/cc/basic/200906/787895_3.html

(二)虚函数的类的对象:http://c.chinaitlab.com/cc/basic/200906/787896.html
(三)虚函数的类的对象(2):http://c.chinaitlab.com/cc/basic/200906/787897.html

(四)类型动态转换和类型强制转换:http://c.chinaitlab.com/cc/basic/200906/787898.html

(五)普通成员函数的调用:http://c.chinaitlab.com/cc/basic/200906/787899.html

(六)虚函数调用:http://c.chinaitlab.com/cc/basic/200906/787900.html

(七)构造函数中的虚函数调用:http://c.chinaitlab.com/cc/basic/200906/787901.html

(八)普通的虚继承:http://c.chinaitlab.com/cc/basic/200906/787902.html

(九)菱形结构的虚继承:http://c.chinaitlab.com/cc/basic/200906/787903.html
(十)菱形结构的虚继承(2):http://c.chinaitlab.com/cc/basic/200906/787904.html
(十一)菱形结构的虚继承(3):http://c.chinaitlab.com/cc/basic/200906/787905.html

(十二)后记:http://c.chinaitlab.com/cc/basic/200906/787906.html

(十三)代码中定义的类的简单说明:http://c.chinaitlab.com/cc/basic/200906/787907.html