C ++ Double Dispatch问题

时间:2011-01-12 16:54:16

标签: c++ double-dispatch

这是我之前提出的问题的第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

非常感谢任何关于这个谜的帮助。

3 个答案:

答案 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 变量,将派生的类转换为基类。

如果你想调用适当的方法,只需用派生类对象调用