C++面向對象模型(虛表與虛表指針)

 

class VirtualSizec++

{函數

    virtual void function_name() {}spa

 

    int data;3d

} v;指針

 

    ///虛函數指針對象

    ///cout << sizeof(v) << endl;  ///在存在virtual函數的時候多四個字節blog

 

若是咱們把 virtual註釋答案是4,有virtual,無論多少,只要有,就會多四個字節的虛表指針。這就是編譯器默默給咱們加上的部分內存

在內存中模型以下ci

類結構:編譯器

class A {

public:

    virtual void vfun1() { cout << "A vfun1" << endl; }

    virtual void vfun2() { cout << "A vfun2" << endl; }

            void fun1() { cout << "A fun1" << endl; }

            void fun2() { cout << "A fun2" << endl; }

private:

    int data1, data2;

};

 

class B: public A{

public:

    virtual void vfun1() { cout << "B vfun1" << endl; }

            void func2() { cout << "B fun2" << endl; }

private:

    int data3;

};

 

class C: public B {

public:

    virtual void vfun1()  { cout << "C vfun1" << endl; }

            void fun2() { cout << "C fun2" << endl; }

private:

    int data1, data4;

};

 

 

 

 

在過去,c語言調用函數經過call 【函數地址】,調用,調用完在回來,這叫靜態綁定。

而如今狀況不是這樣

在面向對象中,存在虛表指針,尋找虛表,再看看調用那個函數

總結:c++編譯器看到函數,會先考慮是靜態綁定仍是動態綁定,靜態綁定相似call xxx。

符合某些條件會作動態綁定。虛擬機制(多態)

1, 指針調用

2, 向上轉形

3, 調用的是虛函數

 而後創建入上圖的機制,覺定到底使用那個東西

相關文章
相關標籤/搜索