MST

星途 面试题库

面试题:C++抽象类派生类的多态性与内存管理

定义一个抽象类`Animal`,包含纯虚函数`makeSound()`。派生出`Dog`和`Cat`类,分别实现`makeSound()`函数发出“汪汪”和“喵喵”的声音。在主函数中,创建一个`Animal`指针数组,分别指向`Dog`和`Cat`对象,通过循环调用`makeSound()`函数实现多态。同时,考虑如何正确管理这些对象的内存,避免内存泄漏。
13.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <memory>

// 定义抽象类Animal
class Animal {
public:
    // 纯虚函数makeSound
    virtual void makeSound() const = 0;
    // 析构函数声明为虚函数,确保正确的析构
    virtual ~Animal() = default;
};

// 派生类Dog
class Dog : public Animal {
public:
    void makeSound() const override {
        std::cout << "汪汪" << std::endl;
    }
};

// 派生类Cat
class Cat : public Animal {
public:
    void makeSound() const override {
        std::cout << "喵喵" << std::endl;
    }
};

int main() {
    // 使用std::unique_ptr管理对象内存,避免内存泄漏
    std::unique_ptr<Animal[]> animals(new Animal*[2] {
        new Dog(),
        new Cat()
    });

    // 通过循环调用makeSound函数实现多态
    for (size_t i = 0; i < 2; ++i) {
        animals[i]->makeSound();
    }

    // 这里std::unique_ptr会自动释放内存,无需手动delete

    return 0;
}
  1. 抽象类 Animal:定义了纯虚函数 makeSound(),用于派生类实现不同的声音行为,并将析构函数声明为虚函数,以确保在释放派生类对象时调用正确的析构函数。
  2. 派生类 DogCat:分别实现了 makeSound() 函数,发出“汪汪”和“喵喵”的声音。
  3. 主函数
    • 使用 std::unique_ptr 管理 Animal 指针数组,从而避免内存泄漏。
    • 通过循环遍历数组,调用 makeSound() 函数,实现多态行为。当 std::unique_ptr 超出作用域时,会自动释放其所管理的对象内存。