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