虛函數表:QT5與VS2015的差異
阿新 • • 發佈:2018-07-10
name bubuko 現象 type src 結果 問題 理論 常識
問題原自下面一段代碼:
初學C++虛函數表時,以下代碼在QT和VS(版本如題)編譯結果不同。
1 #include <iostream> 2 using namespace std; 3 4 5 class Demo 6 { 7 public: 8 Demo() 9 { 10 cout << "Demo()" << endl; 11 } 12 virtual ~Demo() 13 { 14 cout << "~Demo()" << endl;15 } 16 virtual void Fun1() 17 { 18 cout << "Fun1()" << endl; 19 } 20 virtual void Fun2() 21 { 22 cout << "Fun2()" << endl; 23 } 24 virtual void Fun3() 25 { 26 cout << "Fun3()" << endl; 27 } 28 }; 29 30typedef void(FUN)(); 31 int main() 32 { 33 Demo D1; 34 35 int *p = (int *)&D1; 36 37 FUN * pFun = (FUN *)*((int*)*p + 1); 38 pFun(); 39 40 return 0; 41 }
程序目的是運行Demo類虛函數表第二項。
VS運行成功,QT運行失敗。調試了一下,發現如下現象:
VS2015:
QT5:
可見,VS和QT編譯運行方式是有差異的,區別在於QT的Demo類的虛函數表的第一第二項都是析構函數,
個人感覺不太符合C++理論常識。
虛函數表:QT5與VS2015的差異