MST

星途 面试题库

面试题:C++对象特征之高级应用

假设你正在开发一个游戏角色类,这个角色有生命值、攻击力等状态,以及攻击、防御等行为。考虑到面向对象编程中的多态性,如何利用C++的虚函数和继承机制,来实现不同类型角色(如战士、法师)在行为表现上的差异化,同时又能保持对象状态管理的一致性,详细说明设计思路和关键代码实现。
41.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义基类:创建一个基类Character,包含角色共有的状态(生命值、攻击力)和行为(攻击、防御)的虚函数声明。这样可以保证所有派生类都有统一的接口,便于对象状态管理的一致性。
  2. 派生类实现:从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类作为基类,定义了通用的状态和虚函数接口。WarriorMage类继承自Character,并根据各自角色特点重写了attackdefend函数,实现了多态性。在main函数中,通过基类指针调用虚函数,实际执行的是派生类中重写后的函数,体现了不同角色行为表现的差异化。同时,通过基类统一管理对象状态,保持了一致性。