这是我之前提出的问题的第2部分:Is it possible to have polymorphic member overloading in C++?
使用Wiki示例我创建了这个示例。 http://en.wikipedia.org/wiki/Double_dispatch
我的问题是编译后的代码永远不会查找vtable,并且始终使用base而不是继承的类。这是我的代码:
#include <iostream>
class xEntity;
class xVehicle;
class xMapObject
{
public:
virtual void Bump(xMapObject&) { std::cout << "MapObject Bump MapObject\n"; };
virtual void Bump(xEntity&) { std::cout << "MapObject Bump Entity\n"; };
virtual void Bump(xVehicle&) { std::cout << "MapObject Bump Vehicle\n"; };
};
class xEntity : public xMapObject
{
public:
virtual void Bump(xMapObject&) { std::cout << "Entity Bump MapObject\n"; };
virtual void Bump(xEntity&) { std::cout << "Entity Bump Entity\n"; };
virtual void Bump(xVehicle&) { std::cout << "Entity Bump Vehicle\n"; };
};
class xVehicle : public xEntity
{
public:
virtual void Bump(xMapObject&) { std::cout << "Vehicle Bump MapObject\n"; };
virtual void Bump(xEntity&) { std::cout << "Vehicle Bump Entity\n"; };
virtual void Bump(xVehicle&) { std::cout << "Vehicle Bump Vehicle\n"; };
};
int main(int argv, char **argc)
{
xEntity Entity;
xVehicle Vechile;
xMapObject &EntityRef = Entity;
xMapObject &VehicleRef = Vechile;
VehicleRef.Bump(EntityRef);
return 0;
}
但是,输出总是:
Vehicle Bump MapObject
非常感谢任何关于这个谜的帮助。
答案 0 :(得分:6)
你只做了一次调度,而不是双重调度。我们的想法是,在xVehicle
中,xMapObject&
,您可以致电ref.bump(*this);
双重发送。
答案 1 :(得分:1)
正在使用vtable;这就是它调用xVechicle::Bump()
的原因! vtable不用于参数,这没有意义(至少在C ++中)。
典型的解决方案是Bump(xMapObject& obj)
致电obj.Bump(*this);
。
答案 2 :(得分:1)
是一个糟糕的设计xEntity :: Bump(xVehicle&amp;),因为您在基类中使用派生类作为参数。
并且至少你的合同发生变化,你不需要重新定义基础凹凸方法。
问题是您正在创建 xMapRef 变量,将派生的类转换为基类。
如果你想调用适当的方法,只需用派生类对象调用