MST

星途 面试题库

面试题:C++中继承机制的优点在实际项目中如何体现

请举例说明在一个C++实际项目场景里,继承机制的代码复用和可扩展性等优点是怎样具体表现的,例如在设计一个游戏角色系统中,如何利用继承来优化代码结构并实现功能扩展。
16.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

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;
    }
};

在这个例子中,WarriorMageAssassin 类复用了 Character 类的 healthattackPower 属性以及 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;
    }
};

由于 WarriorMageAssassin 类继承自 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;
}

这样通过继承机制,既优化了代码结构,减少了重复代码,又能轻松实现功能扩展。