我想和两个“单位”进行一些“决斗”。 我编写了由两个“单元”构成的类“决斗”。 但是有些“单位”是特殊的(继承自单位),如英雄、老板等。他们想在战斗中使用特殊攻击。 但实际上“决斗”类并不知道谁是英雄,谁是纯单位。
代码如下所示:
#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() 完成时,该对象是非法的。
其次 - 我的英雄变成了纯单位,并且不使用“ super 命中”
是否有可能以优雅的方式修复它(无需更改 main()
中的调用)?
最佳答案
由于切片,最好始终将多态与 智能指针。这将是一个可能的设计:
#include <iostream>
#include <memory>
#include <utility>
using namespace std;
class unit_base
{
public:
virtual ~unit_base() = default;
virtual void make_hit() =0;
};
class unit : public unit_base
{
public:
unit() = default;
virtual void make_hit() override
{
cout << "pure hit" << endl;
}
};
class hero : public unit_base
{
public:
hero() = default;
virtual void make_hit() override
{
cout << "SUPER hit" << endl;
}
};
class duel
{
public:
duel( shared_ptr<unit_base> a, shared_ptr<unit_base> b )
: a(a), b(b)
{}
void start()
{
auto aa = a.lock();
auto bb = b.lock();
if( aa && bb )
{
aa->make_hit();
bb->make_hit();
} else {
cout << "duelist expired" << endl;
}
}
private:
weak_ptr<unit_base> a, b;
};
int main()
{
// use with temporarys
duel{ make_shared<unit>(), make_shared<hero>() }.start();
cout << "-------------" << endl;
// use with variables
auto u = make_shared<unit>();
auto h = make_shared<hero>();
duel d{h,u};
d.start();
cout << "-------------" << endl;
// try to use with expired duelists
u.reset();
d.start();
}
还要记住在您的基类中始终有一个虚拟析构函数。
关于c++ - 从子类调用父虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32487730/