基类指针,访问派生的类成员变量
base class pointer, accessing derived class member variables?
im 剪切代码以使其更具可读性 我希望我不会让这变得难以理解。
class player : public character{
public:
// ---------stuff-------
protected:
// ------stuff--------
vector <item*> inventory;
};
class item {
public:
// -----stuff------------
virtual float getHealth(){};
virtual int getDef(){return 0;};
virtual int getAttAcc(){return 0;};
virtual int getAttPow(){return 0;};
virtual ~item();
protected:
string name;
string type;
int value;
int weight;
};
class weapon : public item{
public:
weapon(int attPow, int attAcc, int inValue, int inWeight, string inType, string inName);
weapon(const weapon& cWeapon);
int getAttAcc(weapon& weapon){return attAcc;};
int getAttPow(){return attPow;};
~weapon(){};
protected:
int attAcc;
int attPow;
};
当我需要武器(用指针存储在库存中)来访问其 attAcc 和 attPow 时,我的问题就来了。
我尝试过的事情:我尝试添加虚拟函数,然后使用派生类更改它们。
我尝试将其排除在基类之外,但由于库存是指向项目的指针向量,因此不允许这样做。
最初我希望玩家有 2 个用于武器和盔甲的指针,但因为库存是一个不起作用的物品指针。
我省略了其他项目的课程,因为我确定一旦我弄清楚了其中一个,其他项目是相同的。 由于我有 3 个派生类,我需要库存来指向基类,对吗?
不确定,你想在这里做什么。
如果你想使用虚函数,最好在派生类中使用 virtual 关键字。
但是,虚函数必须具有相同的参数(又名签名),否则它只会重载基类函数,虚函数机制将不起作用。
在你的例子中,函数int weapon::getAttAcc(weapon& weapon)不会覆盖基类int item::getAttAcc(),因为初始函数没有参数。
你可以添加一个参数到 int item::getAttAcc(weapon& weapon),如果这是你想要的。
另一种解决方案是添加一个类型函数:
class Item {
public:
virtual int getItemType() = 0; // this will make function pure virtual
};
class Weapon : public Item {
public:
virtual int getItemType() { return 1; }
int getAttAcc() {return attAcc;}
}
Item * item = // something
if (item.getItemType() == 1) // weapon
{
Weapon * weapon = (Weapon)item;
weapon->getAttAcc();
}
或者,正如其他评论员所建议的那样。 更C++的方式:
// cast will be successful only for Weapon type object.
if (Weapon * weapon = dynamic_cast<Weapon *>(item)) { // weapon
weapon->getAttAcc();
}
你最直接的错误是你声明了 int weapon::getAttAcc(weapon&),其签名与虚函数 int item::getAttAcc() 不匹配。由于它们不匹配,因此尚未重写基类中的函数。
更根本的是,类项声明仅对类武器项有意义的函数是没有意义的。(当然,除非它们是有意义的。盔甲类型的物品是否也有 attPow 和 attAcc?
也就是说,不要让getAttAcc(我认为它是"获取攻击准确性"的缩写)成为类项的虚拟函数,除非每个项都可用于攻击。
相反,在查看库存时,如果您只想为武器做一些事情,请使用dynamic_cast检查类型。例如:
class weapon : public item {
public:
int getAttAcc() { return attAcc; };
...
}
item *anItem = ...;
if (weapon* aWeapon = dynamic_cast<weapon*> (anItem)) {
... do something with aWeapon->getAttAcc() ...
... and/or with aWeapon->getAttPow() ...
}
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查