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

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

任意のコメント?

4

1 に答える 1

3

基本クラスを知っている必要があります。ダイナミックキャスト先のタイプがわからないと、ダイナミックキャストを使用できません。typeidもありますが、これも基本クラスにはなりません。

これが私がそれを見る方法です:

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

言い換えれば、単純に共通の基本クラスを自分で検索することを防ぐ方法はないので、そもそもなぜこれを行う必要があるのか​​わかりません。

編集:とにかく型情報を捨てているので、voidポインタを使用することはできません。この種のことを行う唯一の方法は、おそらくコンパイル時にテンプレートメタプログラミングを使用することです(私は間違っている可能性があります)が、クラスはこの種の使用を念頭に置いて作成する必要があります。私の知る限り、元のクラスコードを変更することはできません。

于 2012-04-19T21:02:06.457 に答える