2012-04-19 15 views
1
たとえば

:この場合2つのオブジェクトが同じ基本クラスから派生しているかどうかを知る方法?

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のは、同じ基本クラスを派生しているかどうかを知るための最良の/高速な方法だとわからないのですか?

仮想テーブルのエントリを1つずつ比較し、両方の仮想テーブルに関数ポインタが存在する場合は、それらが同じ基本クラスから派生していると言うことができます。これは効率的ではありません。

コメントがありますか?

+0

もしあなたがそれを比較している基底クラスを知っているなら、 'dynamic_cast'を使ってこれを知ることができます。 –

+0

' bool is_same_base(void * obj1、void * obj2) 'の署名を使わなければなりませんか? – GManNickG

+3

実行時にも、コンパイル時にも必要ですか? – pmr

答えて

3

基本クラスを知る必要があります。動的キャストに使用するタイプを知らなくても、動的キャストを使用することはできません。 typeidもありますが、これも基本クラスにはなりません。ここで

が、私はそれを見る方法です:SUB1とSUB2のインスタンスを使用するためには

  1. 、あなたは(それらが宣言されていないと仮定すると、「Sub1.h」と「Sub2.h」を含める必要が同じファイルにあります)。
  2. Sub1.hおよびSub2.hは、どの基本クラスSub1およびSub2から継承するかを述べる必要があります。そうしないと、コードはコンパイルされません。

つまり、共通の基底クラスを自分で検索することはできません。なぜなら、最初にこれを行う必要がある理由はわかりません。

編集:ボイドポインタを使用することはできません。なぜなら、とにかにタイプ情報を捨ててしまうからです。この種のことを行う唯一の方法は、おそらくコンパイル時にTemplate metaprogramming(私は間違っている可能性があります)を使用していますが、あなたのクラスはこのような使い方を念頭に置いて書く必要があります。私が知ることから、元のクラスコードを変更するのはオプションではないようです。

関連する問題