zoukankan      html  css  js  c++  java
  • 深入探索c++对象模型()

    (一) 加上封装后的布局成本

      c++在布局 在存取时间上主要的额外负担是有virtual 引起,包括: 虚函数  虚子类

    虚函数表是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。


    一般继承(有虚函数覆盖)

    1)虚函数按照其声明顺序放于表中。

    2)父类的虚函数在子类的虚函数前面。【父.f】【父.g】【子.f1】【子.g1】

    一般继承(有虚函数覆盖)

    1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。

    2)没有被覆盖的函数依旧。【子.h】【父.g】【子.f1】【子.g1】

    多重继承(无虚函数覆盖)

    1)  每个父类都有自己的虚表。

    2)  子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)

    【父0.f】【父0.g】【子.f1】【子.g1】【父1.f2】【父1.g2】【父2.f3】【父2.g3】

    多重继承(有虚函数覆盖)

    【子.f】【父0.g】【子.f1】【子.g1】【子.f】【父1.f2】【父1.g2】【子.f】【父2.f3】【父2.g3】

    (二) C++对象模型

         非static数据对象配置与class object 内,静态数据对象,静态函数对象,非静态函数存在与class object之外(基本对象模型)

      对包含虚函数的class,生成virtual table,class object 中保存 指向virtual table 的指针 vbtr;vbtr的设定和重置都由构造函数,析构函数,和拷贝函数完成,并保存type_info (用以支持RTTI)(表格驱动模型)

      虚拟继承继承 bases class 不管在继承串链中派生多少次,永远只会有一个实体,例如  

      class istream:virtual public class ios{...};

      class ostream:virtual public class ios{...};

          class iostream:public class istream,public class  ostream{};

      

  • 相关阅读:
    C语言:链表实现的一个实例
    第二次作业——C++学习
    第二次作业———“A+B Format”思路与总结
    hdu 2962 Trucking (二分+最短路Spfa)
    hdu 2680 Choose the best route (dijkstra算法 最短路问题)
    hdu 1233 还是畅通工程 (最小生成树)
    poj 2253 Frogger (dijkstra最短路)
    poj 1062 昂贵的聘礼 (dijkstra最短路)
    hdu 2066 一个人的旅行
    poj 2387 Til the Cows Come Home(dijkstra算法)
  • 原文地址:https://www.cnblogs.com/WillingCPP/p/2989754.html
Copyright © 2011-2022 走看看