面试题答案
一键面试常见场景
在处理继承体系中的对象时,使用 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>
用于管理 Circle
和 Rectangle
对象的生命周期,通过基类指针调用 draw
函数实现了多态性。std::make_unique
用于创建 std::unique_ptr
并初始化对象,这种方式比直接使用 new
和 std::unique_ptr
构造函数更安全和简洁。同时,基类的析构函数声明为 virtual
且默认实现,确保在通过基类指针释放对象时,能正确调用派生类的析构函数。