2012-07-09 123 views
0

可能重複:
Printing derived class name in base classTYPEID不打印信息

我使用GCC,以及下面的代碼輸出令人意想不到的

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

class B { 
    public: 
    B (B * ptr) { cout<< typeid(*ptr).name()<<endl;} 
}; 

class D : public B { 
    public: 
    D() : B(this) { cout<<typeid(this).name()<<endl;} 
}; 

int main() 
{ 
    D d; 
    return 0; 
} 

輸出:

1B 
P1D 

任何人都可以向我解釋爲什麼在這裏基類不能正確地告訴派生類的類型? 非常感謝

+0

另請參閱:http://stackoverflow.com/q/10894683/1025391 – moooeeeep 2012-07-09 13:05:36

回答

3

兩個原因:

  1. 對象(*ptr)尚未完全構造呢。
  2. 你的類不是多態的(沒有虛擬成員函數),所以不存在動態類型信息。
+0

但編譯時不知道typeid信息?如果在編譯時已知,那麼在運行時應該打印派生類的名稱。 – leorex 2012-07-09 13:06:02

+0

@lorex:'* ptr'的動態類型在編譯時是不知道的。它還沒有完全構建。 – 2012-07-09 13:09:15

+0

我現在明白了。非常感謝 – leorex 2012-07-09 13:10:49

0

那東西真的取決於編譯器。 msvc爲此提供了不同的typeid字符串。