gpt4 book ai didi

c++ - 从子类调用父虚函数

转载 作者:行者123 更新时间:2023-11-30 01:46:53 25 4
gpt4 key购买 nike

我想和两个“单位”进行一些“决斗”。我编写了由两个“单元”构成的类“决斗”。但是有些“单位”是特殊的(继承自单位),如英雄、老板等。他们想在战斗中使用特殊攻击。但实际上“决斗”类并不知道谁是英雄,谁是纯单位。

代码如下所示:

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com