虛函數面試題

  1. class A  
  2. {  
  3. public:  
  4.       void function(){printf("Hello World");}  
  5.   
  6. };  
  7.   
  8. class B  
  9. {  
  10. public:  
  11.       virtual void function(){printf("Hello World");}  
  12. };  
  13.   
  14. int _tmain(int argc, _TCHAR* argv[])  
  15. {  
  16.       A* p1 = NULL;  
  17.       p1->function();  
  18.   
  19.       B* p2 = NULL;  
  20.       p2->function();  
  21.   
  22. };  

情況A(不是虛函數):輸出Hello World,程序運行正常;
情況B(有虛函數):程序直接crash;

原因是:不是虛函數的情況,this指針當成第一個參數傳入函數(一般是通過ecx寄存器),主要裏面沒有使用這個this指針,函數運行是沒有問題,如果用到了this指針,譬如訪問了對象的成員變量,同樣會crash。
而虛函數的情況,就不一樣了,這種情況下,對象的第一個成員是虛函數表指針(指向虛函數表,虛表指針的位置可能不不同的編譯器有差異,但原理一樣)。調用虛函數的時候,首先是通過對象地址(this指針)獲得第一個成員(虛表指針)的值,然後再通過虛表指針+偏移獲得相應虛函數的位置,再調用虛函數,其實這是C++多態的原理,因此這個地方因爲對象指針爲NULL,因此去空地址取虛表指針,自然crash了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章