• 深入探索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{};

      

  • 相关阅读:
    Android.02.Button
    Android.01. TextView
    Android.00.IDEA中Android开发环境搭建
    Java34.Marven
    CSS 滚动条样式
    不常用的HTML和CSS 记录
    JS 规则
    svg转化成canvas以便生成base64位的图片
    ArcGIS Server 10.1 安装教程
    ArcGis API JS 4.X 本地化部署
  • 原文地址:https://www.cnblogs.com/WillingCPP/p/2989754.html
Copyright © 2020-2023  润新知