如何理解虚表及其计算含虚函数的类的大小
在什么情況下系統會自動生成缺省(默認)的構造函數?
1、在類里面有一個類類型的對象,這個類有自己的缺省構造函數(有缺省的參數,參數有缺省值)。
class B
{
? ? ?B(int data)
? ? ?{ ?}
};不能合成
class B
{
? ? ?B(int data=0)
? ? ?{ ?}
};會合成
class?B
{
public:
????B(int?data=0)
????{??}
};
class?C:public?B
{
public:
????C()
????????:B(0)
????{??}
????B?b;??//編譯器會自動合成
};
2、類是虛擬繼承
class?B
{
public:
????B()
????{}
};
class?D:virtual?public?B
{
public:
????D()
????{?}
????B?b;
};
3、基類有缺省構造函數,子類沒有顯示定義自己的構造函數
class?B
{
public:
????B(int?data=0)
????{}
};
class?D:?public?B
{
public:
};
4、有虛函數的類,系統自動生成缺省的構造函數來初始化虛指針
class?B
{
public:
????virtual??void?fun()
????{
????????cout?<<?"fun"?<<?endl;
????}
};
前面是一些構造函數方面的總結,菜鳥一個寫的太爛,進來的先湊合著看,會不定時補充,有錯誤的地方還請多多指點
****************************************************************************************
虛函數:
class?Base
{
public:
????virtual?void?FunTest()
????{
????????cout?<<?"Base::FunTest()"?<<?endl;
????}
????virtual?void?FunTest1()
????{
????????cout?<<?"Base::FunTest1()"?<<?endl;
????}
????virtual?void?FunTest2()
????{
????????cout?<<?"Base::FunTest2()"?<<?endl;
????}
????virtual?void?FunTest3()
????{
????????cout?<<?"Base::FunTest3()"?<<?endl;
????}
????virtual?void?FunTest4()
????{
????????cout?<<?"Base::FunTest4()"?<<?endl;
????}
};
int?main()
{
????Base?b;
????system("pause");
????return?0;
}
? ? Base?b;
009253E8??lea?????????ecx,[b]??
009253EB??call????????Base::Base?(0921226h) ??
有call命令說明編譯器有合成缺省構造函數
取b的地址,b指向的那塊空間里存放著另一個地址,該地址指向的空間存放著虛表地址
虛指針指向虛表
虛表的順序和函數的聲明順序是一樣的
虛函數的大小:
***************************計算大小*********************************
class C
{
public:
char a; ?//1
static char b; ?//靜態成員在靜態區域,不在棧區,所以不算
void *p; ? ?//指針占4個字節
static int *c; ? //靜態成員在靜態區域,不在棧區,所以不算
virtual void func1()
{}
virtual void func2()?
{}
//虛函數屬于同一類,故只需要一個這個指針指向虛函數表,
//占用4個字節,就算有N個虛函數,也是4個字節
};
int main()
{
C c;
cout << sizeof(C) << endl; ? ?//12
cout << sizeof(c.a) << endl; ? ?//1 ?
cout << sizeof(c.b) << endl; ? //1 ? ?類型的大小
cout << sizeof(c.c) << endl; ? ?//4 ? ? 類型的大小
cout << sizeof(c.p) << endl; ? ?//4 ??
return 0;
}
轉載于:https://blog.51cto.com/10921020/1766287
總結
以上是生活随笔為你收集整理的如何理解虚表及其计算含虚函数的类的大小的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js模板引擎——art Template
- 下一篇: 1 第一次画PCB总结