2013年3月31日

深入探索c++对象模型(二)

摘要: (一)关于构造函数 首先讲一个也许会被面试问到的问题,构造函数不能是虚函数,原因如下:运行构造函数的时候,总认为当前正在构造的对象是且仅是本类对象(也就是此时的virtual table ptr指向本类的虚函数表),所以虚拟构造函数没有意义。 构造函数中不能利用到更高级别的重写版本,原因很简答:那部分的成员还没有被构造。 也就是讲虚函数表呢是构造时候建立的,而虚函数表是虚函数实现的基本(参见深入探索c++对象模型(一)),所以矛盾了。 编译器会有默认构造函数,但是要记得,它不会给你的data member 赋你需要的值咯。 阅读全文

posted @ 2013-03-31 21:11 WillingCPP 阅读(114) 评论(0) 推荐(0)

深入探索c++对象模型(-)

摘要: (一) 加上封装后的布局成本 c++在布局 在存取时间上主要的额外负担是有virtual 引起,包括: 虚函数 虚子类虚函数表是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。一般继承(有虚函数覆盖)1)虚函数按照其声明顺序放于表中。2)父类的虚函数在子类的虚函数前面。【父.f】【父.g】【子.f1】【子.g1】一般继承(有虚函数覆盖)1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。2)没有被覆盖的函数依旧。【子.h】【父.g】【子.f1】【子.g1】多重继承(无虚函数覆盖)1) 每个父类都有自己的虚表。2) 子类的成员函数被放到了第一个父类的表中。(所. 阅读全文

posted @ 2013-03-31 14:56 WillingCPP 阅读(202) 评论(0) 推荐(0)

导航