c++中使用相同数据成员和函数的两个类之间的继承
Inheritance between two classes in c++ using the same data members and functions
我是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_*/
我如何在不复制方法的情况下创建方法?
现在什么都不做。Weapon
和Fruit
都是 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){}
};
相关文章:
- 两个继承类如何调用彼此的方法?
- 从两个不同类继承的非虚拟基类的访问成员
- 创建一个具有两个可能继承的类
- 无法调用通过两个类继承的虚拟方法
- 从两个类继承的空类,一个是模板
- 无法创建两个从 std::logic_error 继承的自定义异常类
- 从同一类的两个不同模板副本继承时重载
- 从两个无法改变的标头继承
- 从 C++ 中的两个类继承并插入到列表中
- 通过调用两个参数化的父类构造函数来构造继承的类
- 继承-在两个不同的类中使用相同的方法名
- 两个不同的继承指针地址是如何相等的
- 具有不同签名的两个函数的继承隐藏了非虚函数
- 从两个抽象类继承
- 基于可变参数模板的两个交互类的多重继承
- 从两个类继承的类,具有相同的函数原型,彼此冲突
- 从两个模板参数多重继承的奇怪之处
- 防止一个类的派生类对两个类进行多重继承
- 当继承基模板类并将两个类文件放在单独的头文件中时,为什么会出现重定义错误
- 如何在编译时推导出两个类型共有的继承树的根(如果存在)