函数中的指针不称为派生类的重写函数
Pointer in a function is not called the derived class's overridden function
在我的CS课程简介中,我们制作了一个简短的游戏,不同的角色必须相互战斗(攻击点和防御点是通过掷一定数量的骰子产生的)。其中一个角色是影子,它覆盖了基类防御功能,以产生50%的不被击中的机会。我单独测试了被覆盖的函数,它有效,但当我在战斗函数中调用它时,它只是使用了基类版本的防御,尽管扮演的角色是影子。有什么想法吗?我怀疑这与指针有关。是的,基类防御函数被声明为虚拟的。
更新:这是基类和影子类——我删除了与问题无关的成员数据和函数。
//The Character Class
class Character
{
protected:
Dice AttackDie;
Dice DefenseDie;
public:
//The Constructor
Character(string,int,int,int,int,int,int);
virtual int attack();
virtual int defend() const; //I've tested it with and without const, it still doesn't work
int getSP(); //StrengthPoints Accessor
string getName();
friend void combat(Character, Character);
};
//Shadow subclass
class Shadow: public Character
{
//Will override defense
public:
Shadow(string,int,int,int,int,int,int);
//Override the defense function
int defend() const;
};
void Combat(Character char1, Character char2)
{
//Set up the players so that they can alternate
Character* player1 = &char1;
Character* player2 = &char2;
//While loop for combat;
while (char1.getSP() > 1 || char2.getSP() > 1) //Play until a character dies
{
//Variables for combat
int attacksum = 0;
int defensesum = 0;
int result = 0;
int damage = 0;
int hurt = 0;
attacksum = player1->attack(); //Generate attack value
//Generate Attack Points
cout << player1->getName() << " attack points are " << attacksum << endl;
//Generate Defense Points --- This does not call the overriden function when player2 is a Shadow
defensesum = player2->defend(); //Generate defense value
//Display the defeense
cout << player2->getName() << " defense points are " << defensesum << endl;
}
确保方法签名相同(返回值相同,参数相同),并确保函数标记为虚拟。
你可以使用这里发布的想法来解决一些问题:
安全覆盖C++虚拟函数
或者为了进一步的故障排除,你可以把你的基本方法写为:
virtual void baseMethod()=0;
如果您没有正确地重写它,那么编译器应该抛出一个错误。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 使用基类指针创建对象时,缺少派生类析构函数
- 在 C++ 中用派生类型重写成员函数
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如果基类包含双指针成员,则派生类的构造函数
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 在派生类中绑定非静态模板化成员函数
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- C++:为什么无法在派生类中访问受保护的构造函数?
- C++派生的类构造函数
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 覆盖虚拟函数 - 派生类具有不同的参数
- 正在调用基方法,而不是从构造函数派生方法
- 从具有相同虚拟函数的父函数派生时如何调用子函数
- 从派生类对象调用基类函数.派生类构造函数中设置的基类数据成员