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, 調用的是虛函數
而後創建入上圖的機制,覺定到底使用那個東西