C++ Double Dispatch问题

Sha*_*ley 2 c++ double-dispatch

这是我之前提出的问题的第2部分:是否有可能在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;
}
Run Code Online (Sandbox Code Playgroud)

但是,输出总是:

Vehicle Bump MapObject
Run Code Online (Sandbox Code Playgroud)

非常感谢任何有关这个谜的帮助.

Pup*_*ppy 6

你只做了一次调度,而不是双重调度.这个想法是在xVehicle,服用xMapObject&,你会调用ref.bump(*this);双重分派.