基本上我要做的是将'MovingHero'类的实例设置为'ShootingHero',它是'MovingHero'的子类。
正如我现在所说,MovingHero类有一个名为levelUp()的函数,如下所示:
MovingHero levelUp()
{
ShootingHero theHero();
return theHero;
}
在我的主要功能中我有:
if(hero1.getScore() == 5)
hero1 = hero1.levelUp();
我没有收到任何错误,但在if语句执行后,hero1仍然是MovingHero而不是ShootingHero。
我认为这与运营商重载有关,但我不确定。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:3)
运营商超载?!不,它与此无关。
当您从该功能返回时,将<{1}}对象†切换到新的ShootingHero
。为了利用动态多态性,您需要使用间接。这意味着指针和/或引用。
您不能使用对象复制并保留原始的派生类型:您假设您有MovingHero
使用是不正确的。请阅读C ++中有关多态性的书中的章节。
†实际上,你没有有一个MovingHero
对象,因为你写了ShootingHero
这是一个函数声明。您向我们展示的代码将不编译;你可能意味着ShootingHero theHero();
。
答案 1 :(得分:2)
多态性仅适用于指针(以及技术参考,尽管这并不常见)。 MovingHero
和ShootingHero
是两种不同的类型;无法将一种类型的对象成功分配给另一种类型。
MovingHero*
和ShootingHero*
本质上是相同的类型(指针),只是指向的数据类型不同(它对实际指针没有影响(它只是提供编译器)有关什么被视为“合法”))的信息,因此您可以成功地将指向ShootingHero
对象的指针指向指向MovingHero
对象的指针。
实际上,您总是可以使用强制转换将任何类型的指针分配给任何其他类型的指针,尽管这会在您取消引用指针时导致垃圾值。但是,多态性保证转换是有效的,因此不需要转换。
使用多态,可以编写函数:
MovingHero* levelUp()
{
ShootingHero* theHero = new ShootingHero();
return theHero;
}
请注意,您必须在某个时刻手动删除此指针,因为它是动态分配的。