C++虚函数表理解
C++虛函數(shù)表理解
一,思維模式圖
二,代碼驗(yàn)證
class A { public:A(int x) {fProtected = x;}float GetFProtected() {return fProtected;}public:float fpublic = 2.3f; //c++11支持了初始化,但不能使用autostring sname = "liqi";CMyNumOperator<int>* on = new CMyNumOperator<int>(); //對(duì)象也可以void TestFunc() {cout << "TestFunc" << endl;}static void StaticTestFunc() {cout << "Static-TestFunc" << endl;}virtual void ToString() {cout << "A::ToString" << endl;} protected:float fProtected;void ProtectedFunc() {cout << "PRotectedFunc" << endl;} private:void PrivateFunc() {cout << "PrivateFunc" << endl;}};//只管公有繼承,不管保護(hù)繼承和私有繼承,意義不大,也太復(fù)雜 class B : public A { public:friend void TestProtectedDerive();B() :A(1) {}void TestForDerive() {//公有繼承下//1,子類(lèi)可以訪問(wèn)父類(lèi)的保護(hù)成員,不能訪問(wèn)父類(lèi)的私有成員 B ob;//PrivateFunc(); //error,子類(lèi)不能訪問(wèn)基類(lèi)的私有成員ProtectedFunc(); //rightfProtected = 10; //rightob.fProtected = 20; //right }//1,c++中只要基類(lèi)有相同簽名虛函數(shù),則默認(rèn)為此基類(lèi)函數(shù)也是虛函數(shù)[與C#不同],如下情形都成立// (1) 函數(shù)不聲明 virtual// (2) 函數(shù)聲明了 virtual// (3) 函數(shù)聲明了 override// (4) 函數(shù)聲明了 virtual 和 override//2,c++中兩個(gè)關(guān)鍵詞作用不同,可以同時(shí)存在// virtual僅表明函數(shù)是虛函數(shù),override是C++11中出現(xiàn)的,明確說(shuō)明是對(duì)基類(lèi)的重寫(xiě)// 它的好處是當(dāng)函數(shù)聲明不符合規(guī)則時(shí),編譯器會(huì)報(bào)錯(cuò)void virtual ToString() override{cout << "B::ToString" << endl;} };void TestVirtualFunctionTable() {cout << hex;typedef void(*PFUNC)();offsetof(A, fpublic); //利用此函數(shù)可以算函數(shù)布局 A oa(0);B ob;//一,通過(guò)內(nèi)存地址修改不可訪問(wèn)的保護(hù)變量*(float*)((int*)&oa + 1) = 123.4f; //類(lèi)的第一個(gè)變量fpublic賦值,(int*)&oa + 1是跳過(guò)虛函數(shù)指針float fpublic = oa.fpublic;//二,通過(guò)內(nèi)存地址調(diào)用虛函數(shù)//A和B的虛函數(shù)表地址不一樣,也就是說(shuō)父類(lèi)和子類(lèi)各有一張?zhí)摵瘮?shù)表int* pvptr = (int*)(*((int*)(&oa)));cout << "A的虛函數(shù)表地址:" << pvptr << endl; //000DB0D4((void(*)())(*pvptr))(); //A::ToString pvptr = (int*)(*((int*)(&ob)));cout << "B的虛函數(shù)表地址:" << pvptr << endl; //000DB128((void(*)())(*pvptr))(); //B::ToString cout << "--------------------------" << endl;//最簡(jiǎn)寫(xiě)法((void(*)())(*((int*)*(int*)&oa)))();((void(*)())(*((int*)*(int*)&ob)))();}?
posted on 2018-07-19 19:14 時(shí)空觀察者9號(hào) 閱讀(...) 評(píng)論(...) 編輯 收藏
總結(jié)
- 上一篇: 【转】c++虚函数实现原理
- 下一篇: VS2017更新后 在WIN7上找不到