如何声明任何继承类的实例
How can I declare an instance of any inherited class?
我开始用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
,这是一种更喜欢的并集形式。
假设您的单元类型为Goblin
、Troll
和Wizard
,则为:std::variant<Goblin, Troll, Wizard>
。
但是,请注意,变体类与所有变体类型通用的基类不同。换句话说,std::variant<Goblin, Troll, Wizard>
可能是我们心目中的一个单元,但就C++编译器而言,它不是Unit
。因此,您将不得不做一些工作来运行采用Unit&
或Unit*
或Unit
方法的代码。
这里有一个关于使用std::variant
的教程,如果你以前没有使用过,我建议你使用:
简化C++:现代C++功能–std::变体和std::访问
相关文章:
- 名称隐藏对静态函数继承的实例使用
- 您能否实例化模板的非专用版本并在专用化中继承它?
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- C++ 实例化新对象时不接受继承方法默认参数值
- 是否应该使用继承来减少内存消耗的实例的内存分配?
- 如何实例化从使用模板的纯虚拟类继承的对象
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 从抽象类继承的类的实例
- 获取继承的实例化模板的类型
- 无法使用多重继承 c++ 实例化抽象类
- 如何在继承级别的多个实例之间共享相同的数据
- 模板实例和继承的转换错误
- 模板类实例化如何与类继承协同工作
- Cython C 类继承无法实例化派生类
- 实例化指针从继承类函数
- 为什么不能将继承自(非模板)类 B 的实例化类模板 A 的引用转换为对 B 的引用?
- C++用于深层继承的模板单一实例基类
- 如何在不使用继承的情况下'rename'模板实例化?
- 实例化没有继承的对象时出错
- 继承——实例化问题