2010-11-17 49 views
9

我預期這個代碼以打印 '同1' 'Same2',但它打印只有 'Same1':typeid的用於多態類型

#include <iostream> 
#include <typeinfo> 
using namespace std; 

struct C{virtual ~C(){}}; 
struct D : C{}; 
int main(){ 
    D d; 
    C c, &cr1 = d; 
    if(typeid(cr1) == typeid(D)) cout << "Same1"; 
    if(typeid(&cr1) == typeid(D*)) cout << "Same2"; 
} 

兩個§ 5.2.8/2和5.3 §。 1/3似乎暗示我應該打印'Same2'。

什麼和在哪裏捕捉?

+0

你是不是指'C c,* cr1 =&d'? – 2010-11-17 09:10:45

+0

@dark_charlie:這基本上只是將操作員的地址移到兩行。即使你寫了'typeid((C *)&d)',你也會得到相同的結果。 – MSalters 2010-11-17 10:19:36

+0

@ MSalters:啊,我是nm,我只是看不懂。 – 2010-11-17 11:25:26

回答

17

指針不是多態類型。他們沒有虛擬成員。事實上,他們沒有任何成員。它們也不能從其他類型派生,也不能用作基類。因此,T*的靜態和動態類型始終爲T*

在您的「Same2」行中,您正在比較指針的typeid,而不是指向的對象。因此編譯器僅查看靜態類型C*D*。它們顯然不一樣,並且必須有明顯的type_info對象。