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

Inheritance between two classes in c++ using the same data members and functions

本文关键字:两个 继承 之间 函数 数据成员 c++      更新时间:2023-10-16

我是c++编程新手,我想创建两个具有完全相同数据成员和函数的类。是否有可能创建两个具有相同数据成员/函数的继承类,而不是为每个类创建几个重复的方法?我正在制作一款基于《zork》的c++游戏,我想要创造两种道具,武器和水果。两者都接受字符串形式的名称和双精度类型的值。我是否按如下方式创建头文件:

    #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_*/

我如何在不复制方法的情况下创建方法?

现在什么都不做。WeaponFruit 都是 Item s,并且包含了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;
};

(不幸的是,可能)没有办法指定要继承哪个构造函数。要么全部要么没有

希望对你有帮助。

你需要调用父类的构造函数来给description;longDescription;赋值

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