C++ 双分派无限循环

C++ 双分派无限循环,c++,pure-virtual,virtual-functions,double-dispatch,C++,Pure Virtual,Virtual Functions,Double Dispatch,我使用双重分派来获得两个类(B,C)的两个对象之间的距离,这两个类是另一个(A)的子类。 我认为类A中的方法应该是纯虚拟的,但是它们在其他地方的测试中使用,所以类A必须是可实例化的,所以我不能使它们纯虚拟的,对吗 另一件事是,我不确定我是否以一种好的方式使用了双重分派,因为在基类中的Distance(a*a)定义中,有时会生成一个无限循环 在A类中,我有以下方法: virtual double Distance(A *a) {return a->Distance(this);} virt

我使用双重分派来获得两个类(
B
C
)的两个对象之间的距离,这两个类是另一个(A)的子类。 我认为
类A
中的方法应该是纯虚拟的,但是它们在其他地方的测试中使用,所以
类A
必须是可实例化的,所以我不能使它们纯虚拟的,对吗

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

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();}
类C中

double C::Distance(A *a)  { return a->DistanceC(this); }
double C::DistanceB(B *b) { /*calculate distance*/ }
double C::DistanceC(C *c) { /*calculate distance*/ }
因此,如果我有:

A* a1, a2;
我呼吁:

a1->Distance(a2);
上述实施将需要

a2->Distance(a1);
这将要求:

a1->Distance(a2);

…这是一个无限循环。

因为
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); }

请将草莓和樱桃放在最上面,将代码格式化为代码。如果您描述是什么触发了无限循环(显示您调用的方法以及如何调用,即使用哪些参数),这将有助于人们。
double a::Distance(a*a){return a->Distance(this);}
看起来可疑。如果您可以使用C++11,以下内容可能会有所帮助:
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); }