2012-04-19 24 views
1

例如:如何知道兩個對象是否從相同的基類派生?

class Base{...}; 

class Sub1 : public Base{...}; 

class Sub2 : public Base{...}; 

Sub1 s1; 
Sub2 s2; 

bool is_same_base(void *obj1, void *obj2){ 
... 
} 

if(is_same_base(s1,s2){ 
    printf("Great! S1 and S2 and from same base class!\n"); 
} 

在這種情況下,我不知道什麼是知道如果OBJ1和OBJ2派生相同的基類的最佳/快呢?

一種可能的最慢的,但方法是比較虛擬表項一個接一個,如果有的話函數指針存在於這兩個虛擬表,那麼我可以說它們是從相同的基類派生的。這不是有效的。

有何評論?

+0

如果你知道你正在比較哪個基類,你可以使用'dynamic_cast'來解決這個問題 – 2012-04-19 20:46:37

+0

你是否必須使用簽名'bool is_same_base(void * obj1,void * obj2)'? – GManNickG 2012-04-19 20:46:49

+3

必要的運行時間還是編譯時間? – pmr 2012-04-19 20:47:51

回答

3

你必須知道的基類。如果不知道動態投射到哪種類型,則無法使用動態投射。也有typeid,但同樣,這不會給你基類。

這是我看到它的方式:

  1. 爲了使用Sub1的和分公司2的情況下,你需要包括「Sub1.h」和「Sub2.h」(假設他們沒有申報在同一個文件中)。
  2. Sub1.h和Sub2.h需要提及其中基類SUB1與分公司2從繼承,或代碼不會編譯。

換句話說,有沒有辦法可以從簡單的自己找了公共基類來預防,所以我不明白爲什麼你需要做這個擺在首位。

編輯:不能使用空指針,因爲那時你反正扔掉類型的信息。使用Template metaprogramming(我可能是錯誤的),編譯時你可以做這種事情的唯一方法是,但是你的類需要考慮這種用法。從我所知道的看來,修改原始類代碼不是一種選擇。

相關問題