91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解虛表及其計算含虛函數的類的大小

發布時間:2020-08-11 07:31:35 來源:網絡 閱讀:428 作者:淺唱逝流年 欄目:編程語言

在什么情況下系統會自動生成缺省(默認)的構造函數?

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;

}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大埔县| 邵阳市| 个旧市| 武夷山市| 高安市| 德州市| 长丰县| 徐水县| 石嘴山市| 中卫市| 青州市| 新绛县| 道孚县| 龙门县| 庆城县| 淮北市| 长垣县| 临夏市| 岱山县| 南江县| 丹凤县| 江华| 镶黄旗| 崇明县| 沈丘县| 新津县| 南投市| 太原市| 宝坻区| 阿巴嘎旗| 镇赉县| 营山县| 凭祥市| 青阳县| 无锡市| 游戏| 瓮安县| 临武县| 汤原县| 台南市| 平顶山市|