【发布时间】:2014-02-18 14:02:26
【问题描述】:
我正在使用双重调度来获取 2 个类(B,C)的 2 个对象之间的距离,它们是另一个 (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*/ }
【问题讨论】:
-
请在上面放草莓和樱桃,将代码格式化为代码。
-
如果您描述触发无限循环的原因(显示您正在调用的方法以及如何调用,即使用哪些参数),这将对人们有所帮助。
-
double A::Distance(A *a) {return a->Distance(this);}看起来很可疑。 -
如果您可以使用 C++11,以下可能会有所帮助:ideone.com/8VxALs
标签: c++ pure-virtual virtual-functions double-dispatch