面试题答案
一键面试设计思路
- 定义基类:创建一个基类
Character
,包含角色共有的状态(生命值、攻击力)和行为(攻击、防御)的虚函数声明。这样可以保证所有派生类都有统一的接口,便于对象状态管理的一致性。 - 派生类实现:从
Character
类派生出Warrior
(战士)和Mage
(法师)类,在这些派生类中重写基类的虚函数,以实现不同类型角色在行为表现上的差异化。
关键代码实现
#include <iostream>
// 基类Character
class Character {
protected:
int health;
int attackPower;
public:
Character(int h, int ap) : health(h), attackPower(ap) {}
// 虚函数:攻击行为
virtual void attack() {
std::cout << "Character attacks with base attack power." << std::endl;
}
// 虚函数:防御行为
virtual void defend() {
std::cout << "Character defends with base defense." << std::endl;
}
};
// 派生类Warrior
class Warrior : public Character {
public:
Warrior(int h, int ap) : Character(h, ap) {}
// 重写攻击行为
void attack() override {
std::cout << "Warrior attacks with melee attack, dealing " << attackPower << " damage." << std::endl;
}
// 重写防御行为
void defend() override {
std::cout << "Warrior defends with shield, reducing damage." << std::endl;
}
};
// 派生类Mage
class Mage : public Character {
public:
Mage(int h, int ap) : Character(h, ap) {}
// 重写攻击行为
void attack() override {
std::cout << "Mage casts a spell, dealing " << attackPower << " magic damage." << std::endl;
}
// 重写防御行为
void defend() override {
std::cout << "Mage creates a magic shield, reducing magic damage." << std::endl;
}
};
可以通过以下方式使用这些类:
int main() {
Character* warriorPtr = new Warrior(100, 20);
Character* magePtr = new Mage(80, 30);
warriorPtr->attack();
warriorPtr->defend();
magePtr->attack();
magePtr->defend();
delete warriorPtr;
delete magePtr;
return 0;
}
在上述代码中,Character
类作为基类,定义了通用的状态和虚函数接口。Warrior
和Mage
类继承自Character
,并根据各自角色特点重写了attack
和defend
函数,实现了多态性。在main
函数中,通过基类指针调用虚函数,实际执行的是派生类中重写后的函数,体现了不同角色行为表现的差异化。同时,通过基类统一管理对象状态,保持了一致性。