0

次のクラス階層があります。

class Base{
....
virtual bool equal(Base *);
}

class Derived1: public Base{
....
virtual bool equal(Base *);
}
class Derived2: public Derived1{
}
class Derived3: public Derived1{
}
class Derived4: public Base{
}

Derived4 と同様のクラスを比較する Base::equal(Base *) 関数をどのように記述すればよいですか? これらにはデータ フィールドがないため、実際のオブジェクトが同じ派生クラスであることのみを確認してください。

Derived1::equal(Base) の書き方 - Derived2 と Derived3 は類似しており、データ フィールドがなく、Derived1 のデータ フィールドで比較し、オブジェクトが同じ派生クラスからのものであることを確認する必要があります。

更新:次のような各派生クラスに同一の関数を記述したくないため、これが必要です。

bool Derived::equal(Base *b){ 
  Derived *d = dynamic_cast<Derived*>(b); 
  return d; 
} 
4

2 に答える 2

3

ポリモーフィックな型間比較に使用できる一般的な手法は、"double dipatch" と呼ばれます ( Double Dispatchを参照してください)。特定の問題に適用できます。その場合、「false」または「true」のいずれかを返すだけで、本体がほとんど空のオーバーロードされた関数が多数作成されます。

もちろん、動的な型だけを比較したい場合は、実行時の型情報 (つまり、'typeid' を使用) を使用して比較できます。

于 2009-10-11T08:39:18.970 に答える
2

ここでtypeid演算子を使用できると思います。次のようなことができます:

typeid(*pointerBase) == typeid(*this);

しかし、なぜこのようなことをしたいのですか?非常に疑わしいので、デザインを再検討することをお勧めします。

于 2009-10-11T07:33:26.357 に答える