zoukankan      html  css  js  c++  java
  • 关于类大小的小试验

    首先:

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        void foo(){}
    };
    
    class B:public A
    {
    public:
        void foo(){}
    };
    
    class C:public A
    {
    public:
        void foo(){}
    };
    
    class D: public B,public C
    {
    public:
        void foo(){}
    };
    
    int main(int argc, char *argv[])
    {
        A a;
        B b;
        C c;
        D d;
        cout<<"A 的大小为: "<<sizeof(A)<<endl;
        cout<<"B 的大小为: "<<sizeof(B)<<endl;
        cout<<"C 的大小为: "<<sizeof(C)<<endl;
        cout<<"D 的大小为: "<<sizeof(D)<<endl;
        return 0;
    }
    /* output
    A 的大小为: 1
    B 的大小为: 1
    C 的大小为: 1
    D 的大小为: 1
    */

    然后是有虚函数的

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        virtual void foo(){}
    };
    
    class B:public A
    {
    public:
        void foo(){}
    };
    
    class C:public A
    {
    public:
        void foo(){}
    };
    
    class D: public B,public C
    {
    public:
        void foo(){}
    };
    
    int main(int argc, char *argv[])
    {
        A a;
        B b;
        C c;
        D d;
        cout<<"A 的大小为: "<<sizeof(A)<<endl;
        cout<<"B 的大小为: "<<sizeof(B)<<endl;
        cout<<"C 的大小为: "<<sizeof(C)<<endl;
        cout<<"D 的大小为: "<<sizeof(D)<<endl;
        return 0;
    }
    /* output
    A 的大小为: 4
    B 的大小为: 4
    C 的大小为: 4
    D 的大小为: 8
    */

    由于A中foo为虚函数,因此A对象内有一个指向虚函数表的指针,即A对象大小为4。B和C均为单继承,所以也只有一个虚函数指针,也为4字节。D有继承自两个类,且两个类均有虚函数,故有两个虚函数表指针,所以为8字节。

    再者,看看虚继承的情况

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        void foo(){}
    };
    
    class B:virtual public A
    {
    public:
        void foo(){}
    };
    
    class C:virtual public A
    {
    public:
        void foo(){}
    };
    
    class D: public B,public C
    {
    public:
        void foo(){}
    };
    
    int main(int argc, char *argv[])
    {
        A a;
        B b;
        C c;
        D d;
        cout<<"A 的大小为: "<<sizeof(A)<<endl;
        cout<<"B 的大小为: "<<sizeof(B)<<endl;
        cout<<"C 的大小为: "<<sizeof(C)<<endl;
        cout<<"D 的大小为: "<<sizeof(D)<<endl;
        return 0;
    }
    /* output
    A 的大小为: 1
    B 的大小为: 4
    C 的大小为: 4
    D 的大小为: 8
    */

    对虚继承的结果表示不理解,听说《深度探索C++对象模型》有介绍,要抽个时间看一看。

    以上试验均在VS2008环境下编译运行。

  • 相关阅读:
    Exection throws和throw
    Exection(二)
    JAVA-Exception
    IDEA初见---输出HelloWorld,并打包成jar包
    Centos6.5安装Tomcat
    Centos6.5下装ZooKeeper
    LInux下装jdk
    python作业高级FTP
    tcp黏包
    计算器
  • 原文地址:https://www.cnblogs.com/wnarutou/p/2732833.html
Copyright © 2011-2022 走看看