2014-09-26 74 views
2
#include <iostream> 
using namespace std; 
class A 
{ 
public : 
    void show() 
    { 
     cout << "A " << endl; 
    } 

}; 
class B : public A 
{ 
public : 
    void show() 
    { 
     cout << "B " << endl; 
    } 
}; 
int main() 
{ 
    A *a =NULL; 
    a->show(); // Prints 'A' 
    B *b =NULL; 
    b->show(); // Prints 'B' 
} 

這是如何得到印刷當我們從AB繼承show,如何show()可以使用B類對象叫什麼名字?從B繼承A究竟發生了什麼?使用NULL類指針,可以調用類成員函數。這怎麼可能?

+4

解除引用空指針是未定義的行爲。你使用哪種編譯器允許這樣的行爲? – CoryKramer 2014-09-26 12:08:30

+1

我剛剛用g ++ 4.8.1試過他的代碼,它也打印A和B. – 2014-09-26 12:10:41

+3

那麼,它仍然是UB。編譯器等可以做任何他們想要的。一旦有虛擬的東西,它肯定會崩潰。 – deviantfan 2014-09-26 12:11:22

回答

1

這是未定義的行爲,但很多實現會按照您看到的方式行事。考慮這個電話:

a->show(); 

編譯器可以看到,一個沒有基類,而show()不虛。所以唯一可能的調用函數是A::show()。太好了,援引它!所有你需要做的事情(如果你是編譯器)通過a作爲this,即隱藏函數的第一個參數。如果this從未在函數中使用,它可能會工作得很好。

即便如此,這並不能保證工作,不可移植,並且是一個壞主意。不要這樣做。你的褲子可能會燃燒。

相關問題