• 对一个类求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;
    }
  • 相关阅读:
    EFCore
    PS-邮件发送异常信息
    python-Django
    Autofac
    swagger
    查看哪个程序占用了端口
    SQL SERVER-系统数据库还原
    破解root密码
    WebApi路由
    async,await.task
  • 原文地址:https://www.cnblogs.com/wangxiaokun/p/7063846.html
Copyright © 2020-2023  润新知