驗證**如下:
#include
using namespace std;
typedef long long ll;
class
a virtual void f()
virtual void g()
virtual ~a
() };
typedef void(*func)
();int main()
輸出結果:
vs2017 x64平台
ubuntu1604 64位(g++5.4.0)
輸出f和g的位址以及對f和g進行呼叫是為了驗證程式的正確性。無論是vs還是g++,兩個物件的虛函式表位址都是一樣的,說明兩個物件共享虛函式表。
既然單一虛函式錶類的物件都共享虛函式表,那麼無論繼承類的物件有多少個虛函式表,這些虛函式表應該都是共享的。下面驗證:
#include
using namespace std;
typedef long long ll;
class
a virtual void ga()
};class
b virtual void gb()
};class
c: public a, public b
;typedef void(*func)
();int main()
輸出如下:
vs2017 x64平台
ubuntu1604 64位(g++5.4.0)
可以看出,c1和c2的兩個虛函式表位址仍然是一樣的。
結論:如果乙個類有虛函式,那麼這個類的所有物件共享乙個虛函式表。
C 判等物件是否相等的方法彙總
一 判斷相等的3個方法 1.例項方法 public virtual bool equals object obj 2.比較值型別靜態方法 public static bool equals object obja,object objb 3.比較引用型別靜態方法 pub static bool re...
C 虛函式 物件 類對應的位址
在c 中的多型中,我們通過位址的訪問來尋找虛函式 物件 類的位址。具體看 實現 include stdafx.h include using namespace std class a virtual void f int i class b public a virtual void f int ...
C 函式中返回的物件是否進行優化執行結果
include using namespace std struct foo foo const foo void operator const foo foo gcc 缺省會進行rov優化,不會呼叫拷貝建構函式,直接把棧內的f物件提公升級呼叫函式可用物件,避免呼叫拷貝建構函式及銷毀棧內的f物件的效...