因此,我的类层次结构是:BaseClass(是一个抽象类),它有三个继承它的子类:ArcaneWarrior,Guardian,Magi。C++具有子类特定值的不变成员变量
我想要为每个子类特定的DefaultHealth和DefaultMana有两个不可更改的值,因为它们对于这两个变量都有不同的值。
我想我只是寻找最好/最有效的方式来做到这一点。
我应该只在基类中有两个虚函数来返回DefaultHealth和DefaultMana,并且在我想要的值的子类硬代码中?
我明白任何见解
因此,我的类层次结构是:BaseClass(是一个抽象类),它有三个继承它的子类:ArcaneWarrior,Guardian,Magi。C++具有子类特定值的不变成员变量
我想要为每个子类特定的DefaultHealth和DefaultMana有两个不可更改的值,因为它们对于这两个变量都有不同的值。
我想我只是寻找最好/最有效的方式来做到这一点。
我应该只在基类中有两个虚函数来返回DefaultHealth和DefaultMana,并且在我想要的值的子类硬代码中?
我明白任何见解
我投票给基类const
值和protected
构造:
class BaseClass{
const unsigned default_health;
const unsigned default_mana;
protected:
BaseClass(unsigned def_hp, unsigned def_mp)
: default_health(def_hp)
, default_mana(def_mp)
{
}
public:
// your functions...
};
class ArcaneWarrior
: public BaseClass
{
public:
ArcaneWarrior()
: BaseClass(200, 50)
{
}
// ...
};
这是优于2种方式的virtual
功能的方法:
const
-ness(这些值不能改变,永远)虚函数不给你const
-ness,看下面的例子:
class BaseClass{
public:
virtual unsigned GetDefaultHealth() const = 0;
virtual unsigned GetDefaultMana() const = 0;
// ...
};
class ArcaneWarrior
: public BaseClass
{
unsigned default_health, default_mana;
public:
virtual unsigned GetDefaultHealth() const{
return default_health;
}
virtual unsigned GetDefaultHealth() const{
return default_mana;
}
void SetDefaults(unsigned health, unsigned mana){
default_health = health;
default_mana = mana;
}
};
是的,这是真正做到这一点的最好和最直接的方式。使用虚拟函数,您可以同时获得所需的“不变性”以及能够在不知道确切类型的情况下通过指向基类的指针(或引用)来确定该值。
他们只给你常量性,如果你让他们。为什么他要将'SetDefaults'添加到接口,如果他们想要它们是const。他用虚拟函数返回的硬编码值的当前方法也是真正的常量(你不能获得比文字更多的常量)。如果你不喜欢硬编码的值,你仍然可以返回子类/方法/文件的静态常量变量的值。但我同意第一个优点。 –
不要变量也需要“保护”吗? –
@Seth:只有当你想派生类实际访问它们时,它们本身并不需要。但在这种情况下,它只能被允许,因为它们是'const'。如果他们不是,你最好写保护访问器。 – Xeo