C++ 如何将类的实例更改为子类的实例

C++ 如何将类的实例更改为子类的实例,c++,polymorphism,subclass,C++,Polymorphism,Subclass,基本上,我想做的是将“movingero”类的一个实例设置为“ShootingHero”,这是“MovingHero”的一个子类 正如我现在看到的,MovingHero类有一个名为levelUp()的函数,如下所示: MovingHero levelUp() { ShootingHero theHero(); return theHero; } 我的主要职能是: if(hero1.getScore() == 5) hero1 = hero1.levelUp(); 我没有

基本上,我想做的是将“movingero”类的一个实例设置为“ShootingHero”,这是“MovingHero”的一个子类

正如我现在看到的,MovingHero类有一个名为levelUp()的函数,如下所示:

MovingHero levelUp()
{
    ShootingHero theHero();
    return theHero;
}
我的主要职能是:

if(hero1.getScore() == 5)
   hero1 = hero1.levelUp();
我没有得到任何错误,但是在if语句执行之后,hero1仍然是MovingHero而不是ShootingHero


我认为这与运算符重载有关,但我不确定。任何帮助都将不胜感激。谢谢

运算符重载?!不,这与此无关

当您从该函数返回时,您将
ShootingHero
对象†分割成一个新的
MovingHero
。为了利用动态多态性,您需要使用间接寻址。这意味着指针和/或引用

您不能使用对象复制并保留原始的最派生类型:您认为您有一个
movingero
要处理的假设是不正确的。请阅读C++关于多态性的书的章节。< /P>

†实际上,您没有
ShootingHero
对象,因为您编写了
ShootingHero theHero()这是一个函数声明。你给我们看的代码不会编译;你的意思可能是射击英雄

运算符重载?!不,这与此无关

当您从该函数返回时,您将
ShootingHero
对象†分割成一个新的
MovingHero
。为了利用动态多态性,您需要使用间接寻址。这意味着指针和/或引用

您不能使用对象复制并保留原始的最派生类型:您认为您有一个
movingero
要处理的假设是不正确的。请阅读C++关于多态性的书的章节。< /P>

†实际上,您没有
ShootingHero
对象,因为您编写了
ShootingHero theHero()这是一个函数声明。你给我们看的代码不会编译;你的意思可能是射击英雄

多态性仅适用于指针(和技术上的引用,尽管这并不常见)
movingero
ShootingHero
是两种不同的类型;无法成功地将一种类型的对象分配给另一种类型的对象

movingero*
ShootingHero*
但是本质上都是相同的类型(指针),只是指向的数据类型不同(这对实际指针没有影响(它只是向编译器提供有关什么是“合法的”)而已,因此,您可以成功地将指向
ShootingHero
对象的指针分配给指向
MovingHero
对象的指针

实际上,您始终可以使用强制转换将任何类型的指针分配给任何其他类型的指针,尽管在取消引用指针时,这通常会导致垃圾值。但是,多态性保证转换是有效的,因此不需要强制转换

使用多态性,您的函数可以编写为:

MovingHero* levelUp()
{
    ShootingHero* theHero = new ShootingHero();
    return theHero;
}

请注意,您必须在某个点手动删除此指针,因为它是动态分配的。

多态性仅适用于指针(以及技术上的引用,尽管这并不常见)
movingero
ShootingHero
是两种不同的类型;无法成功地将一种类型的对象分配给另一种类型的对象

movingero*
ShootingHero*
但是本质上都是相同的类型(指针),只是指向的数据类型不同(这对实际指针没有影响(它只是向编译器提供有关什么是“合法的”)而已,因此,您可以成功地将指向
ShootingHero
对象的指针分配给指向
MovingHero
对象的指针

实际上,您始终可以使用强制转换将任何类型的指针分配给任何其他类型的指针,尽管在取消引用指针时,这通常会导致垃圾值。但是,多态性保证转换是有效的,因此不需要强制转换

使用多态性,您的函数可以编写为:

MovingHero* levelUp()
{
    ShootingHero* theHero = new ShootingHero();
    return theHero;
}

注意,你必须手动删除某个指针,因为它是动态分配的。

你也可以考虑使用一些有用的模式,比如,这真的是你的代码吗?因为
射击英雄()
是一个函数声明,而不是变量定义。@Fred我在几分钟前的回答中已经谈到了这一点。@Fredah,最烦人的解析!“我甚至没听清楚。”瓦勒哈尔夫哈特:我发现在这种情况下,这有点用词不当。我的意思是,这并不是那么烦人!当您想要传递一个临时的as构造函数参数时,这很麻烦:
ShootingHero theHero(heromgictype())你也可以考虑使用一些有用的模式,比如,这真的是你的代码吗?因为
射击英雄()
是一个函数声明,而不是变量定义。@Fred我在几分钟前的回答中已经谈到了这一点。@Fredah,最烦人的解析!“我甚至没听清楚。”瓦勒哈尔夫哈特:我发现在这种情况下,这有点用词不当。我的意思是,这并不是那么烦人!当您想要传递一个临时的as构造函数参数时,这很麻烦:
ShootingHero theHero(heromgictype())
多态性仅适用于指针。
并非如此。多态性是C++对象的一个基本事实,它具有虚函数,但是由于复制执行切片,所以只能用指针或引用来使用。感谢您的建议。
多态性仅适用于指针。
并非如此。多态性是C++对象的一个基本事实,但它具有复制功能。