0

二重ディスパッチを使用して、別の (A) のサブクラスである2 つのクラス ( B、 )の 2 つのオブジェクト間の距離を取得しています。のメソッドは純粋仮想であるべきだCと思いますが、他の場所のテストで使用されるため、インスタンス化可能でなければならないので、純粋仮想にすることはできませんよね?class Aclass A

Distance(A *a)もう 1 つのことは、基本クラスの の定義で無限ループが発生する場合があるため、ダブル ディスパッチを適切に使用しているかどうかわからないことです。

にはclass A、次のメソッドがあります。

virtual double Distance(A *a)  {return a->Distance(this);}
virtual double DistanceB(B *b) {return std::numeric_limits<double>::max();}
virtual double DistanceB(C *c) {return std::numeric_limits<double>::max();}
virtual double DistanceC(B *b) {return std::numeric_limits<double>::max();}
virtual double DistanceC(C *c) {return std::numeric_limits<double>::max();}

class B

double B::Distance(A *a)  { return a->DistanceB(this); }
double B::DistanceB(B *b) { /*calculate distance*/ }
double B::DistanceC(C *c) { return c->DistanceB(this); }

class C

double C::Distance(A *a)  { return a->DistanceC(this); }
double C::DistanceB(B *b) { /*calculate distance*/ }
double C::DistanceC(C *c) { /*calculate distance*/ }
4

2 に答える 2

0
virtual double Distance(A *a)
{return a->Distance(this);}

だから私が持っている場合:

A* a1, a2;

そして私は電話します:

a1->Distance(a2);

前述の実装は、

a2->Distance(a1);

どちらが呼び出されます:

a1->Distance(a2);

...そして、それは無限ループです。

于 2014-02-18T14:32:36.223 に答える