1. 程式人生 > 實用技巧 >C++類物件大小問題(二)

C++類物件大小問題(二)

前面談的類物件裡面都只含有非靜態變數,如下程式碼所示:

class Base
{
public:
    char ch;
    int sh;
};

現在在這個的基礎上新增靜態變數試試看:

#include<iostream>
using namespace std;
class Base
{
public:
    char ch;
    int sh;
    static int x;
};
int Base::x = 0;
int main()
{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    
while (1); return 0; }

輸出:

分析:

繼續新增成員:

#include<iostream>
using namespace std;
class Base
{
public:
    char ch;
    int sh;
    static int x;
    void foo() {}
};
int Base::x = 0;
int main()
{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    while (1);
    return
0; }

輸出:

分析:記憶體圖同上。

繼續新增,再看看:

#include<iostream>
using namespace std;
class Base
{
public:
    char ch;
    int sh;
    static int x;
    void foo() {}
    virtual void func() {}
};
int Base::x = 0;
int main()
{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    while
(1); return 0; }

輸出:

分析:

繼續擴充套件:

#include<iostream>
using namespace std;
class Base1
{
public:
};
class Base:public Base
{
public:
    char ch;
    int sh;
    static int x;
    void foo() {}
    virtual void func() {}
};
int Base::x = 0;
int main()
{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    while (1);
    return 0;
}

輸出:

分析:記憶體圖同上一個。

引入繼承看看(沒有虛擬函式版):

#include<iostream>
using namespace std;
class Base1
{
public:
    char c;
    int s;
};
class Base:public Base1
{
public:
    char ch;
    int sh;
    static int x;
    void foo() {
}
};
int Base::x=0;

int main()

{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    printf("%d\n", (&Base::c));
    printf("%d\n", (&Base::s));
    printf("%d\n", (&Base::ch));
    printf("%d\n",(&Base::sh));
    return 0;
}

輸出:

分析:

繼續擴充套件加入子類虛擬函式:

#include<iostream>
using namespace std;
class Base1
{
public:
    char c;
    int s;
};
class Base:public Base1
{
public:
    char ch;
    int sh;
    static int x;
    void foo() {}
    virtual void func() {}
};
int Base::x = 0;
int main()
{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    printf("%d\n", (&Base::c));
    printf("%d\n", (&Base::s));
    printf("%d\n", (&Base::ch));
    printf("%d\n",(&Base::sh));

    while (1);
    return 0;
}

輸出:

分析:

對於這一種,為了更清楚的理解,改動下程式碼在比較一下看看:

#include<iostream>
using namespace std;
class Base1
{
public:
    char c;
};
class Base:public Base1
{
public:
    char ch;
    int sh;
    static int x;
    void foo() {}
    virtual void func() {}
};
int Base::x = 0;
int main()
{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    printf("%d\n", (&Base::c));
    printf("%d\n", (&Base::ch));
    printf("%d\n",(&Base::sh));

    while (1);
    return 0;
}

輸出;

分析:

繼續擴充套件:

#include<iostream>
using namespace std;
class Base1
{
public:
    char c;
    int s;
    virtual void ff()
    {}
};
class Base:public Base1
{
public:
    char ch;
    int sh;
    static int x;
    void foo() {}
    virtual void func() {}
};
int Base::x = 0;
int main()
{
    cout << "sizeof(Base)=" << sizeof(Base) << endl;
    printf("%d\n", (&Base::c));
    printf("%d\n", (&Base::s));
    printf("%d\n", (&Base::ch));
    printf("%d\n",(&Base::sh));

    while (1);
    return 0;
}

輸出:

分析:

到這裡基本上單繼承結束。