2012-10-01 131 views
4

有什麼方法可以檢查兩個實例是否是相同的派生類?例如:從基類中識別派生類

Base *inst1 = new A(); 
Base *inst2 = new B(); 
Base *inst3 = new A(); 


bool b1 = (inst1->class== inst2->class); //<-- should evaluate to false 
bool b1 = (inst2->class== inst3->class); //<-- should evaluate to true 

很明顯,我可以將一個虛函數添加到基類並實現每個派生類以返回一個唯一值。不過,我寧願不必爲派生類實現任何特定的任何東西,因爲我正在基於派生自此基類的API。

回答

8
typeid(*inst1) == typeid(*inst2) 

假設Base至少有一個虛擬功能。否則,typeid將無法獲得正確的派生類型。

+0

只要是明確的,但也沒有辦法一個基類之間的區別和它的派生類(不這樣做不安全的類型轉換),如果沒有虛函數,所以你可能不會無論如何關心那個警告。 – CrazyCasta

+0

@CrazyCasta - 好點。它看起來像一個安全的假設... –

+0

太棒了。謝謝! – bofjas

0

我不知道一個方法返回派生實例的類。但是,dynamic_cast可用於檢查實例是否與特定類兼容。

A & inst_ans = dynamic_cast(inst2); 將拋出異常

其中as A & inst_ans = dynamic_cast(inst1); 將執行正常

http://en.wikipedia.org/wiki/Dynamic_cast