- class A
- {
- public:
- void function(){printf("Hello World");}
- };
- class B
- {
- public:
- virtual void function(){printf("Hello World");}
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- A* p1 = NULL;
- p1->function();
- B* p2 = NULL;
- p2->function();
- };
情況A(不是虛函數):輸出Hello World,程序運行正常;
情況B(有虛函數):程序直接crash;
原因是:不是虛函數的情況,this指針當成第一個參數傳入函數(一般是通過ecx寄存器),主要裏面沒有使用這個this指針,函數運行是沒有問題,如果用到了this指針,譬如訪問了對象的成員變量,同樣會crash。
而虛函數的情況,就不一樣了,這種情況下,對象的第一個成員是虛函數表指針(指向虛函數表,虛表指針的位置可能不不同的編譯器有差異,但原理一樣)。調用虛函數的時候,首先是通過對象地址(this指針)獲得第一個成員(虛表指針)的值,然後再通過虛表指針+偏移獲得相應虛函數的位置,再調用虛函數,其實這是C++多態的原理,因此這個地方因爲對象指針爲NULL,因此去空地址取虛表指針,自然crash了。