多态性和切片参考

时间:2015-11-24 13:17:18

标签: c++ polymorphism multiple-dispatch single-dispatch

我没有完全理解C ++中的对象切片。使用以下示例代码,两个对象似乎接收相同的处理,但是多态只适用于其中一个。

我使用引用,其中一个对象似乎没有被切片。我相信在launch_ship函数调用期间必须发生一些事情,但我不确切地知道出了什么问题。

以下是示例代码。

#include <iostream>


class SpaceShip
{};

class MilleniumFalcon: public SpaceShip
{};

class Pilot
{
public:
     virtual void operate(SpaceShip&)
    {
        std::cerr << "Operating spaceship" << std::endl;
    }

    virtual void operate(MilleniumFalcon&)
    {
        std::cerr << "Cannot operate that spaceship!" << std::endl;
    }
};

class Chewbacca: public Pilot
{
public:
    virtual void operate(SpaceShip&)
    {

        std::cerr << "Don't want to operate that low spaceship!" <<
                  std::endl;
    }

    virtual void operate(MilleniumFalcon&)
    {
         std::cerr << "Operating the Millenium Falcon" << std::endl;
    }
};

void launch_ship(Pilot& pilot, SpaceShip& ship)
{
      pilot.operate(ship);
}

int main()
{
    Chewbacca chewie;
    MilleniumFalcon millenium;

    launch_ship(chewie, millenium);
}
  

输出:不想操作那艘低宇宙飞船!

1 个答案:

答案 0 :(得分:3)

这里没有切片。

C ++使用单个调度而不是多个调度。

virtual完成的调度只能通过this实例完成。

所以在

pilot.operate(ship);

只有pilot的调度(并使用动态类型的导频),但我们使用静态类型ship(所以SpaceShip&

您必须使用访问者或实施多次调度。

例如:

class SpaceShip
{
public:
    virtual void operate_by(Pilot& pilot) { pilot.operate(*this); }
};

class MilleniumFalcon: public SpaceShip
{
public:
    virtual void operate_by(Pilot& pilot) override { pilot.operate(*this); }
};


void launch_ship(Pilot& pilot, SpaceShip& ship)
{
    ship.operate_by(pilot);
}

Demo