【发布时间】:2015-09-09 19:29:12
【问题描述】:
我想用两个“单位”做一些“决斗”。 我编写了由两个“单元”构成的类“决斗”。 但是某种“单位”是特殊的(继承自单位),如英雄、boss等。他们想在战斗中使用特殊打击。 但实际上“决斗”类不知道谁是英雄,谁是纯单位。
代码如下:
#include <iostream>
class unit{
public:
unit(){};
virtual void make_hit(){
std::cout<<"pure hit\n";
}
};
class hero:public unit {
public:
hero():unit(){};
void make_hit(){
std::cout<<"SUPER hit\n";
}
};
class duel {
unit *a, *b;
public:
duel(unit _a, unit _b):a(&_a),b(&_b){};
void start (){
a->make_hit();
b->make_hit();
}
};
int main(){
duel(unit(),hero()).start();
return 0;
}
我有两个主要问题。
首先 - 我使用的是指构造函数中的临时对象。当 Duel::duel() 完成时,该对象是非法的。
第二个——我的英雄变成了纯粹的单位,不使用“超级命中”
是否有可能以优雅的方式修复它(无需更改main() 中的调用)?
【问题讨论】:
-
IIRC,您传递的是您创建的对象的副本,而不是原始对象。并且副本是由 param 变量定义的类型。见cplusplus.com/forum/windows/9891
-
在不更改
main()中的调用的情况下,没有优雅的方法可以修复它。对不起。 -
好的,我知道没有引用或指针构造函数将对象切割成单元对象。谢谢。
-
理论上,你可以使用右值引用
(unit&&)。但是,这会带来寿命问题。在你写的代码中,这不会有问题,但是如果你使用临时构建一个对决,然后再使用它,那就有问题了。
标签: c++ class polymorphism