zoukankan      html  css  js  c++  java
  • 对一个类求sizeof,虚继承

    转帖:http://blog.sina.com.cn/s/blog_728161840100u2ib.html

    一、空类

    求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。

    class  A
    {
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        int a = sizeof(A); // a = 1
    
        return 0;
    }

    二、简单的类

    这个也好求,就是sizeof(A.a)+4(指向虚表的指针)

    class  A
    {
        int a;
        virtual void fun1();
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        int a = sizeof(A); // a = 8
    
        return 0;
    }

    三、子类普通继承、父类中不含虚函数

    sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虚表指针)

    class  A
    {
        int a;
    };
    
    class B:public A
    {
         int b;
         virtual void fun();
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        int a = sizeof(A); // a = 4
        int b = sizeof(B); // b = 12
    
        return 0;
    }

    四、子类普通继承、父类含虚函数

    sizeof(B)=sizeof(A)-4(sizeof(A)中有一个指向虚表的指针)+sizeof(B.b)+4(指向虚表指针)

    class  A
    {
        int a;
        virtual void fun1();
    };
    
    class B:public A
    {
         int b;
         virtual void fun();
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        int a = sizeof(A); // a = 8
        int b = sizeof(B); // b =12
    
        return 0;
    }

    五、子类虚继承、父类不含虚函数

    sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)

    class  A
    {
        int a;
    };
    
    class B:virtual public A
    {
         int b;
         virtual void fun();
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        int a = sizeof(A); // a = 4
        int b = sizeof(B); // b = 16
    
        return 0;
    }

    六、子类虚继承、父类含虚函数

    sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
    虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。

    class  A
    {
        int a;
        virtual void fun1();
    };
    
    class B:virtual public A
    {
         int b;
         virtual void fun();
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        int a = sizeof(A); // a = 8
        int b = sizeof(B); // b =20
    
        return 0;
    }
  • 相关阅读:
    SpringMVC学习指南【笔记6】JSTL标签、函数
    SpringMVC学习指南【笔记5】EL表达式、实现免脚本JSP页面、禁用EL计算的设置
    SpringMVC学习指南【笔记4】数据绑定、表单标签库、转换器、格式化、验证器
    序列封包和序列解包
    python 字符串分割,连接方法
    Jmeter常用插件(转)
    不同的content-type,Jmeter入参不同
    性能监测(CPU)
    正则表达式
    乱码问题
  • 原文地址:https://www.cnblogs.com/wangxiaokun/p/7063846.html
Copyright © 2011-2022 走看看