多态性和引用切片
Polymorphism and Slicing with references
我没有完全理解 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);
}
output : Don't want to operate that low spaceship!
这里没有切片。
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);
}
我没有完全理解 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);
}
output : Don't want to operate that low spaceship!
这里没有切片。
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);
}