2011-11-24 104 views
3

因此,我的类层次结构是:BaseClass(是一个抽象类),它有三个继承它的子类:ArcaneWarrior,Guardian,Magi。C++具有子类特定值的不变成员变量

我想要为每个子类特定的DefaultHealth和DefaultMana有两个不可更改的值,因为它们对于这两个变量都有不同的值。

我想我只是寻找最好/最有效的方式来做到这一点。

我应该只在基类中有两个虚函数来返回DefaultHealth和DefaultMana,并且在我想要的值的子类硬代码中?

我明白任何见解

回答

5

我投票给基类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功能的方法:

  • 在运行时没有虚拟讯(没有开销)
  • true 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; 
    } 
}; 
+0

他们只给你常量性,如果你让他们。为什么他要将'SetDefaults'添加到接口,如果他们想要它们是const。他用虚拟函数返回的硬编码值的当前方法也是真正的常量(你不能获得比文字更多的常量)。如果你不喜欢硬编码的值,你仍然可以返回子类/方法/文件的静态常量变量的值。但我同意第一个优点。 –

+0

不要变量也需要“保护”吗? –

+0

@Seth:只有当你想派生类实际访问它们时,它们本身并不需要。但在这种情况下,它只能被允许,因为它们是'const'。如果他们不是,你最好写保护访问器。 – Xeo

2

是的,这是真正做到这一点的最好和最直接的方式。使用虚拟函数,您可以同时获得所需的“不变性”以及能够在不知道确切类型的情况下通过指向基类的指针(或引用)来确定该值。