读后的简单总结

lemonClover
2011-02-13 看过
    这本书写得很拗口,侯捷的翻译也有很多不符合习惯的用词,所以读起来颇为费力。

总结一下:
1. 虚函数的实现:
       为每个带有虚函数的类,建立一个虚函数表,存放这个类的每个虚函数的地址。基类和派生类的虚函数表有着不同的内容。
       每个有虚函数的类的对象带有(至少一个)指向上述虚函数表的指针。在调用的时候,根据虚函数表指针,间接定位到虚函数表中的一项。

2. 多重继承:
        设类C继承了A和B,通常而言,类C对象的布局会依次包含A、B两个子对象。类C需要建立两个虚函数表,一个用于A以及C自身的虚函数,一个用于B的虚函数。类C的对象从而还需要有两个虚函数表指针。
        当C*转换为B*时,需要对指针进行移动以定位到B子对象的起始位置;
        但是,当调用虚函数的时候,又需要把this指针调整到C对象的起始位置,否则在C的成员函数中引用成员变量会出错。因此,编译器需要生成额外的代码,在调用虚函数之前调整this指针。

3. 虚继承
        class A {}
        class B : public virtual A {}
        class C : public virtual A {}
        class D : public B, public C {}

        B、C对象中各有1份A子对象;D继承了B和C,但是公共的基类A应该只有1份。
        基本的实现方式是通过指针来间接共享基类数据。在B对象中放置一个指针,指向基类A的子对象的起始位置,存取A的数据时,通过指针进行间接定位。缺点是当有多个虚基类的时候空间占用比较大,当继承链比较长的时候存取比较慢。
        也有的做法通过在虚函数表中单独设置一项,存放虚基类对象的偏移。
        
4. 构造、析构、复制
        构造函数的执行过程:
        1. 调用基类的构造函数(对于虚基类则只在most derived时才会调用);
        2. 设置虚函数表指针;
        3. 扩展初始化成员列表,调用成员变量的构造函数;
        4. 执行程序员定义的构造函数体。

        析构函数执行过程相反。

        复制构造函数/赋值运算符,当有虚函数或者虚继承的时候,需要正确设置虚函数表指针,因此这时候不能直接采用按位复制的策略。
6 有用
0 没用

查看更多豆瓣高分好书

评论 2条

添加回应

深度探索C++对象模型的更多书评

推荐深度探索C++对象模型的豆列

了解更多图书信息

豆瓣
免费下载 iOS / Android 版客户端