2010-06-02 90 views
2

我的問題與C++中的RTTI有關,我試圖檢查一個對象是否屬於另一個對象的類型層次結構。 BelongsTo()方法檢查這一點。 我嘗試使用typeid,但它會引發錯誤,我不確定任何其他方式如何找到要在運行時轉換爲目標類型。通過檢測當前'this'對象類型在C++中進行類型轉換

#include <iostream> 
#include <typeinfo> 

class X 
{ 
    public: 
     // Checks if the input type belongs to the type heirarchy of input object type 
     bool BelongsTo(X* p_a) 
     { 
      // I'm trying to check if the current (this) type belongs to the same type 
      // hierarchy as the input type 
      return dynamic_cast<typeid(*p_a)*>(this) != NULL; // error C2059: syntax error 'typeid' 
     } 
}; 

class A : public X 
{ 
}; 

class B : public A 
{ 
}; 

class C : public A 
{ 
}; 

int main() 
{ 
    X* a = new A(); 
    X* b = new B(); 
    X* c = new C(); 
    bool test1 = b->BelongsTo(a); // should return true 
    bool test2 = b->BelongsTo(c); // should return false 
    bool test3 = c->BelongsTo(a); // should return true 
} 

製作方法虛擬,讓派生類做這似乎是一個好主意,因爲我有同類型層次結構中的很多類。 還是有人知道任何其他/更好的方式來做同樣的事情嗎?請建議。 (a)應檢測輸入對象類型(a)是否是類型層次結構中當前對象(b)的祖先。

+0

雖然我不確定這可以b如果做得好,我也不知道這*如何可能會有用。出於好奇,你爲什麼想要實現這一目標? – ereOn 2010-06-02 11:29:57

+0

有關示例,請參閱Neil答案的評論。 – Elroy 2010-06-02 11:33:39

+0

例如。 C派生自B派生自A,X派生自A.在某些情況下,我可能需要驗證基類指針(A *)指向的對象類型應該是類型B,而不是類型X,失敗我會拋出一個錯誤。 – Elroy 2010-06-02 11:37:40

回答

2

這沒什麼意義 - 您可以調用該函數的事實意味着該參數屬於X層次結構,因爲這是參數的類型。動態轉換旨在找出已知層次結構中的實際類型。

的語法錯誤代碼:

return dynamic_cast<typeid(*p_a)*>(this) != NULL; 

是因爲typeid的是不是一個類型 - 你根本無法將它用這樣的dynamic_cast類型。

如果作爲納文提出要看看實例屬於一個子層次,使用方法:

if (dynamic_cast <A*>(some_x_ptr)) { 

    // yes, belongs to A sub-hierarchy 
} 

編輯:您有:

A <- P <- X 
A <- Q <- Y 

然後:

A * a = new X; 

dynamic_cast <P *>(a); // not null 
dynamic_cast <Q *>(a); // null 
+0

請注意,'B類'和'C類'是從'A類'派生的。我認爲OP的意圖是找出傳遞的對象是否屬於這個子層次。 – Naveen 2010-06-02 09:55:50

+0

我很抱歉沒有讓自己真正清楚。例如。 X派生自P,Y派生自Q,其中P和Q派生自A.因此,X屬於P和A,Y屬於Q和A,但X不屬於Q.我需要這種行爲。 – Elroy 2010-06-02 11:20:08

+0

我不確定是否有這種檢測的名稱,但它看起來像檢查祖先。 – Elroy 2010-06-02 11:22:13

2

爲了使RTTI正常工作class X至少需要一個虛擬成員函數(虛擬析構函數也算在內)。如果沒有虛擬成員函數,類將不會有由編譯器生成的vtable,因此當調用typeid時,後者將無法按預期工作。

+0

我在每個類中添加了一個虛擬析構函數。但它仍然顯示語法錯誤。有任何想法嗎? – Elroy 2010-06-02 09:51:29

+0

是的,請參閱Neil Butterworth的答案。 – sharptooth 2010-06-02 10:06:27