使用相同的数据成员和函数在c ++中的两个类之间的继承

时间:2014-03-24 13:27:15

标签: c++ inheritance

我是C ++编程的新手,我想创建两个具有完全相同的数据成员和函数的类。是否可以创建两个具有相同数据成员/函数的继承类,而不是为每个类创建多个重复方法。我正在制作一个基于zork的c ++游戏,我想创建两个项目,武器和水果。两者都将名称作为字符串,值作为double。我是否按如下所示创建头文件:

    #ifndef ITEM_H_
    #define ITEM_H_

    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;

    class Item {
    private:
        string description;
        string longDescription;
        float value;

    public:
        Item (string description, float inValue);
        Item (string description);
        string getShortDescription();
        string getLongDescription();
        float getValue();
        void setValue(float value);
    };
class Weapon:: public Item{
     };

    class Fruit:: public Item {
    };


    #endif /*ITEM_H_*/

如果不重复方法,我怎么能不创建方法?

2 个答案:

答案 0 :(得分:0)

暂时不做任何事。 WeaponFruit 都是 Item,并且包含Item所做的所有成员和方法。

迟早,你会想要专门化子类的行为,并且基类中的方法的实现不会这样做(如果首先有一个实现是明智的)。这就是多态性的用武之地。您将在派生类中的基类virtual覆盖中创建该方法:

class Item {
public:
    virtual void Use() = 0;  // pure virtual method
};

class Weapon : public Item {
public:
    virtual void Use() override
    {
        Fire();
    }
private:
    void Fire() { /* do something */ }
};

现在当你有一个引用或指向基类的指针并在其上调用Use时,它将调度到派生类中的相应方法。

编辑:没有办法“复制”构造函数。如果要实例化,每个类至少需要一个。由于您声明了Item (string description, float inValue);,因此您需要将其定义为Item的成员:

Item (string description, float inValue)
    : description(description) // <-- avoid duplicating names of members in parameter list,
    , value(inValue)           // it does the right thing, but hurts readability
    { /* body empty */ }

如果需要使用相同的参数调用派生类的构造函数,则需要定义另一个构造函数并将参数转发给基类的构造函数:

Weapon::Weapon(string desc, float val)
: Item(desc, val) { }

在C ++ 11中,有一个快捷方式 - 你可以继承构造函数,编译器会为你生成这些转发构造函数:

class Weapon : public Item {
     using Item::Item;
};

(遗憾的是,或许)无法指定要继承的构造函数。这是全有或全无。

希望有所帮助。

答案 1 :(得分:0)

你需要调用父类的构造函数来为description;longDescription;分配值

class Weapon:: public Item{
      Weapon(string description, float inValue):Item(description,inValue){}
      Weapon(string description):Item(description){}
 };