面试题答案
一键面试1. 代码复用
假设我们在设计一个游戏角色系统,有不同类型的角色,比如战士(Warrior)、法师(Mage)和刺客(Assassin)。这些角色都有一些共同的属性和行为,例如都有生命值(health)、攻击力(attackPower),都可以移动(move)。
我们可以先定义一个基类 Character
:
class Character {
protected:
int health;
int attackPower;
public:
Character(int h, int ap) : health(h), attackPower(ap) {}
void move() {
std::cout << "Character is moving." << std::endl;
}
};
然后战士、法师和刺客类可以继承自 Character
类:
class Warrior : public Character {
public:
Warrior(int h, int ap) : Character(h, ap) {}
void attack() {
std::cout << "Warrior attacks with melee weapon, dealing " << attackPower << " damage." << std::endl;
}
};
class Mage : public Character {
public:
Mage(int h, int ap) : Character(h, ap) {}
void castSpell() {
std::cout << "Mage casts a spell, dealing " << attackPower << " damage." << std::endl;
}
};
class Assassin : public Character {
public:
Assassin(int h, int ap) : Character(h, ap) {}
void stealthAttack() {
std::cout << "Assassin makes a stealth attack, dealing " << attackPower << " damage." << std::endl;
}
};
在这个例子中,Warrior
、Mage
和 Assassin
类复用了 Character
类的 health
、attackPower
属性以及 move
方法,避免了重复编写相同的代码,提高了代码的复用性。
2. 可扩展性
假如游戏策划决定为所有角色添加一个新的属性 “防御力(defense)”,并且需要一个方法来显示角色的状态(包括生命值、攻击力和防御力)。
我们只需要在 Character
基类中添加这个属性和方法:
class Character {
protected:
int health;
int attackPower;
int defense;
public:
Character(int h, int ap, int def) : health(h), attackPower(ap), defense(def) {}
void move() {
std::cout << "Character is moving." << std::endl;
}
void displayStatus() {
std::cout << "Health: " << health << ", Attack Power: " << attackPower << ", Defense: " << defense << std::endl;
}
};
由于 Warrior
、Mage
和 Assassin
类继承自 Character
类,它们自动获得了新添加的 defense
属性和 displayStatus
方法,无需在每个子类中单独添加。这体现了继承机制在可扩展性方面的优势,方便对整个角色系统进行功能扩展。
例如在主函数中使用:
int main() {
Warrior w(100, 20, 10);
w.move();
w.attack();
w.displayStatus();
Mage m(80, 30, 5);
m.move();
m.castSpell();
m.displayStatus();
Assassin a(90, 25, 8);
a.move();
a.stealthAttack();
a.displayStatus();
return 0;
}
这样通过继承机制,既优化了代码结构,减少了重复代码,又能轻松实现功能扩展。