Я не полностью понимал нарезку объектов в 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);
}
вывод: не хочу управлять этим низким космическим кораблем!
Здесь нет нарезки.
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);
}
Других решений пока нет …