【问题标题】:C++ Double Dispatch problemsC++ 双重调度问题
【发布时间】:2011-01-12 16:54:15
【问题描述】:

这是我之前提出的问题的第 2 部分:Is it possible to have polymorphic member overloading in C++?

我使用 Wiki 示例创建了这个示例。 http://en.wikipedia.org/wiki/Double_dispatch

我的问题是编译后的代码从不查找 vtable,并且总是使用基类而不是继承的类。这是我的代码:

#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

非常感谢您对这个谜团的任何帮助。

【问题讨论】:

    标签: c++ double-dispatch


    【解决方案1】:

    您只进行了一次调度,而不是两次调度。这个想法是,在xVehicle 中,采用xMapObject&amp;,您将调用ref.bump(*this);,这是双重调度。

    【讨论】:

    • 现在很有意义。谢谢!
    • 我需要等待计时器到期。
    • @Shawn:别忘了这个
    【解决方案2】:

    它正在使用 vtable;这就是为什么它打电话给xVechicle::Bump()! vtable 不用于参数,这没有意义(至少在 C++ 中)。

    典型的解决方案是拥有例如Bump(xMapObject&amp; obj) 致电obj.Bump(*this);。

    【讨论】:

      【解决方案3】:

      xEntity::Bump(xVehicle&) 是一个糟糕的设计,因为您在派生类的基类中用作参数。

      至少你的合同发生了变化,你不需要重新定义基本的 Bump 方法。

      问题是您正在创建 xMapRef 变量,将您的 派生 类转换为基类。

      如果你想调用相应的方法,只需使用派生类对象调用

      【讨论】:

      • 这只是为了测试目的,按照维基的例子。在实际版本中已更改。
      猜你喜欢
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      相关资源
      最近更新 更多