溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

發(fā)布時(shí)間:2020-08-11 07:31:35 來(lái)源:網(wǎng)絡(luò) 閱讀:428 作者:淺唱逝流年 欄目:編程語(yǔ)言

在什么情況下系統(tǒng)會(huì)自動(dòng)生成缺省(默認(rèn))的構(gòu)造函數(shù)?

1、在類里面有一個(gè)類類型的對(duì)象,這個(gè)類有自己的缺省構(gòu)造函數(shù)(有缺省的參數(shù),參數(shù)有缺省值)。

class B

{

     B(int data)

     {  }

};不能合成

class B

{

     B(int data=0)

     {  }

};會(huì)合成

class B

{

public:

    B(int data=0)

    {  }

};

class C:public B

{

public:

    C()

        :B(0)

    {  }

    B b;  //編譯器會(huì)自動(dòng)合成

};

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

2、類是虛擬繼承

class B

{

public:

    B()

    {}

};

class D:virtual public B

{

public:

    D()

    { }

    B b;

};

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

3、基類有缺省構(gòu)造函數(shù),子類沒(méi)有顯示定義自己的構(gòu)造函數(shù)

class B

{

public:

    B(int data=0)

    {}

};

class D: public B

{

public:

};

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小


4、有虛函數(shù)的類,系統(tǒng)自動(dòng)生成缺省的構(gòu)造函數(shù)來(lái)初始化虛指針

class B

{

public:

    virtual  void fun()

    {

        cout << "fun" << endl;

    }

};

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

前面是一些構(gòu)造函數(shù)方面的總結(jié),菜鳥(niǎo)一個(gè)寫的太爛,進(jìn)來(lái)的先湊合著看,會(huì)不定時(shí)補(bǔ)充,有錯(cuò)誤的地方還請(qǐng)多多指點(diǎn)

****************************************************************************************

虛函數(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命令說(shuō)明編譯器有合成缺省構(gòu)造函數(shù)

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

取b的地址,b指向的那塊空間里存放著另一個(gè)地址,該地址指向的空間存放著虛表地址

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

如何理解虛表及其計(jì)算含虛函數(shù)的類的大小

虛指針指向虛表

虛表的順序和函數(shù)的聲明順序是一樣的

虛函數(shù)的大小:

***************************計(jì)算大小*********************************

class C

{

public:

char a;  //1

static char b;  //靜態(tài)成員在靜態(tài)區(qū)域,不在棧區(qū),所以不算

void *p;    //指針占4個(gè)字節(jié)

static int *c;   //靜態(tài)成員在靜態(tài)區(qū)域,不在棧區(qū),所以不算

virtual void func1()

{}

virtual void func2() 

{}

//虛函數(shù)屬于同一類,故只需要一個(gè)這個(gè)指針指向虛函數(shù)表,

//占用4個(gè)字節(jié),就算有N個(gè)虛函數(shù),也是4個(gè)字節(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;

}


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI