Полиморфизм и нарезка со ссылками

Я не полностью понимал нарезку объектов в 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);
}

вывод: не хочу управлять этим низким космическим кораблем!

0

Решение

Здесь нет нарезки.

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);
}

демонстрация

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]