0

B我正在使用双重调度来获取 2 个类 ( , )的 2 个对象之间的距离,C它们是另一个 (A) 的子类。我认为其中的方法class A应该是纯虚拟的,但是它们在其他地方的测试中使用,所以class A必须是可实例化的,所以我不能让它们成为纯虚拟的,对吧?

另一件事是我不确定我是否以一种好的方式使用双重调度,因为有时会Distance(A *a)在基类的定义中生成无限循环。

在中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

由于A不是纯粹的抽象,您还必须提供:

virtual double DistanceA(A *a);
virtual double DistanceA(B *b);
virtual double DistanceA(C *c);
virtual double DistanceB(A *a);
virtual double DistanceC(A *a);

并修复

double A::Distance(A *a) {return a->DistanceA(this); }
于 2014-02-18T14:40:01.943 回答
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 回答