标题可能有点误导,但我想通过多态性为类的某个实例提供不同类的实例。我认为这可能会进一步引起误解,因此我举一个例子。
假设我有一个名为Spell
的类,它是该类Firebolt
的父类。我希望另一个类(例如Character
)能够在其内存中包含拼写“ Firebolt”,而不必#include'firebolt'的文件。
现在,我可以想到以前的游戏以前已经做到的方式。通过为每个咒语(或任何其他特定类类型)赋予一个静态const字符串ID或名称,并且在咒语中具有一些可以访问此ID /名称和return
(如果它们相同)的功能。
实际上,这听起来不错,我遇到的问题是我不知道如何编写代码。我不确定如何从父类访问这些ID,也不确定如何制作实际上返回正确的new Firebolt()
的虚函数。任何帮助都将是惊人的。我还将在此处提供我正在使用的实际类代码,以防可能有助于您解答或有类似问题的人解决它。
父类;
class Art {
std::string name;
int EPCost;
int castTime;
int AoESize;
public:
Art(std::string n, int cp, int ct, int as):name(n), EPCost(cp), castTime(ct), AoESize(as) {}
virtual ~Art() {}
static Art* findArt(std::string ID);
int getAoESize() {return AoESize;}
std::string getName() {return name;}
int getEPCost() {return EPCost;}
virtual int getBaseDamage() = 0;
};
子类;
class FireBolt:public Art {
static const std::string name;
static const int EPCost;
static const int castTime;
static const int AoESize;
static const std::string ID;
public:
FireBolt():Art(name, EPCost, castTime, AoESize) {}
~FireBolt() {}
int getBaseDamage();
};
最佳答案
您需要做的只是公开您的FireBolt::ID
。
class FireBolt:public Art {
public:
static const std::string ID;
...
};
Art* Art::findArt(const std::string& ID)
{
if (ID == FireBolt::ID)
return new FireBolt(...);
...
}