MST

星途 面试题库

面试题:C++ 中 std::unique_ptr 与多态性结合使用的场景

请描述在 C++ 编程中,std::unique_ptr 与多态性结合使用的一个常见场景,并给出简单代码示例说明如何正确实现。
17.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

常见场景

在处理继承体系中的对象时,使用 std::unique_ptr 可以高效地管理对象内存,并且通过基类指针实现多态调用。例如,在一个图形绘制的程序中,有不同类型的图形(如圆形、矩形等)继承自一个基类 Shape。使用 std::unique_ptr<Shape> 可以方便地创建和管理不同类型图形的对象,同时利用多态性调用它们各自的绘制函数。

代码示例

#include <iostream>
#include <memory>

// 基类
class Shape {
public:
    virtual void draw() const {
        std::cout << "Drawing a shape." << std::endl;
    }
    virtual ~Shape() = default;
};

// 派生类
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a rectangle." << std::endl;
    }
};

int main() {
    // 创建指向基类的 std::unique_ptr
    std::unique_ptr<Shape> shape1 = std::make_unique<Circle>();
    std::unique_ptr<Shape> shape2 = std::make_unique<Rectangle>();

    // 调用多态函数
    shape1->draw();
    shape2->draw();

    return 0;
}

在上述代码中,std::unique_ptr<Shape> 用于管理 CircleRectangle 对象的生命周期,通过基类指针调用 draw 函数实现了多态性。std::make_unique 用于创建 std::unique_ptr 并初始化对象,这种方式比直接使用 newstd::unique_ptr 构造函数更安全和简洁。同时,基类的析构函数声明为 virtual 且默认实现,确保在通过基类指针释放对象时,能正确调用派生类的析构函数。