如何声明任何继承类的实例

How can I declare an instance of any inherited class?

本文关键字:继承 实例 任何 何声明 声明      更新时间:2024-09-28

我开始用C++编写一个简单的程序来适应OOP。我写了一个类Game,它将类Player和Unit的实例作为属性:

#ifndef GAME_HPP
#define GAME_HPP
#include "Unit.hpp"
#include "Player.hpp"
class Game
{
public:
//ATTRIBUTES
Player player;
Unit mob;

//CONSTRUCTORS
Game(Player, Unit){};

//METHODS
std::string get_n_chars(char, int);
void print_player_character_panel();
void print_enemy_character_panel();
void print_character_panels();
};
#endif // GAME_HPP

我希望"mob"属性采用任何继承的"单位"类,即

class Goblin : public Unit
{...
int main()
{    
Player hero{"Boi"};
Goblin goblin;
Game game1(hero, goblin);

return 0;
}

但当我这样做的时候,"暴徒"只有"单位"的属性和方法。像这样:

https://i.stack.imgur.com/nShv3.png

甚至来自建设者的属性也发生了变化:

https://i.stack.imgur.com/mPrW2.png

我可以以某种方式将任何继承的"Unit"类的实例声明为mob属性,并使其保持为该类的实例而不是"Unit"吗

tl;dr:考虑使用变体

我可以以某种方式将任何继承的"Unit"类的实例声明为mob属性,并使其保持为该类的实例而不是"Unit"吗

只要您愿意在编译时说明哪些类继承了Unit,那么-是的,差不多。你可以使用std::variant,这是一种更喜欢的并集形式。

假设您的单元类型为GoblinTrollWizard,则为:std::variant<Goblin, Troll, Wizard>

但是,请注意,变体类与所有变体类型通用的基类不同。换句话说,std::variant<Goblin, Troll, Wizard>可能是我们心目中的一个单元,但就C++编译器而言,它不是Unit。因此,您将不得不做一些工作来运行采用Unit&Unit*Unit方法的代码。

这里有一个关于使用std::variant的教程,如果你以前没有使用过,我建议你使用:

简化C++:现代C++功能–std::变体和std::访问