zoukankan      html  css  js  c++  java
  • [C++]对象模型总结

    在只有虚函数,或者只有虚继承的情况下,各个编译器中对C++的内存模型的实现是一样的。但同时存在虚函数和虚继承时,GCC与VC就会有差别。

    class Base//4
    {
        int a;
    };
    
    class Base1 :public Base//8
    {
        int a;
    };
    
    class Base2 : public Base//8
    {
        int a;
    };
    
    class Base3//4
    {
        virtual void funa(){}
    };
    
    //两个虚继承分别使用两个指针指向自己的虚基类,然后两个基类有2个int
    //应为使用了共同的虚基类,base的int只有一个,因此2*4+4+4+4=20
    //有多个虚继承的时候,就有多个虚指针
    class Derve:public virtual Base1,virtual Base2//20
    {
    
    };
    
    //base1有2个a,base2有两个a,就是基类的a有两份
    class Derve0:public  Base1, Base2//16 base1有2个a,base2有两个a,
    {
    
    };
    
    class Derve1:public Derve//20
    {
    
    };
    
    class Derve2:public Derve//24
    {
        int a;
    };
    
    //GCC当中 虚基类指针也会并入虚表中,VC不会,所有VC是24
    class Derve3:public Derve//24 -- 20
    {
        virtual void fun(){}
    };
    
    //多个虚继承共用一个虚表,一个虚指针
    class Derve4:public Base3//4
    {
        virtual void fun(){}
    };
    
    ////GCC当中 虚基类指针也会并入虚表中,所以只有一个虚指针,VC是12
    class Derve5:virtual public Base3//12 -- 8
    {
        int a;
    };
    
    class Derve6:public Derve3//24,VC28
    {
        virtual void fun(){}
        int a;
    };

    总结:

    1、多个虚函数共用一个虚表

    2、多个虚继承会建立多个虚表,因此会有多个虚指针

    3、在GCC中,如果同时有虚继承和虚函数,则指向虚基类的指针也会放在虚表中,就是每个虚继承只有一个虚指针;但多个虚继承仍然会有多个虚指针。

    4、在VC中,虚函数指针与虚基类指针不会合并,同时存在。如Derve3例子

  • 相关阅读:
    python3+requests库框架设计03-请求重新封装
    python3+requests库框架设计02-封装日志类
    [patl2-001]紧急救援
    [patl1-046]整除光棍
    latex学习
    matlab基础功能实践
    dll注入及卸载实践
    编译原理大作业暂存
    12.24逆向工程上机作业整理
    [poj1703]Find them, Catch them(种类并查集)
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3288612.html
Copyright © 2011-2022 走看看