我是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_*/
如果不重复方法,我怎么能不创建方法?
答案 0 :(得分:0)
暂时不做任何事。 Weapon
和Fruit
都是 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){}
};