C++類物件大小問題(二)
阿新 • • 發佈:2020-06-29
前面談的類物件裡面都只含有非靜態變數,如下程式碼所示:
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); return0; }
輸出:
分析:記憶體圖同上。
繼續新增,再看看:
#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; }
輸出:
分析:
到這裡基本上單繼承結束。