在 C++ 中,std::shared_ptr
和多态(通过虚函数和基类指针/引用实现)可以很好地结合使用。这种组合通常用于管理对象的生命周期,同时允许通过基类指针或引用来实现多态。
下面是一个简单的示例,演示如何使用 std::shared_ptr
来管理多态对象的生命周期:
cpp
#include <iostream>
#include <memory>
// 基类
class Shape {
public:
virtual void draw() const {
std::cout << "Drawing a shape" << std::endl;
}
virtual ~Shape() {
std::cout << "Destroying a shape" << std::endl;
}
};
// 派生类
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle" << std::endl;
}
~Circle() override {
std::cout << "Destroying a circle" << std::endl;
}
};
class Square : public Shape {
public:
void draw() const override {
std::cout << "Drawing a square" << std::endl;
}
~Square() override {
std::cout << "Destroying a square" << std::endl;
}
};
int main() {
// 使用 std::shared_ptr 管理多态对象的生命周期
std::shared_ptr<Shape> shapePtr = std::make_shared<Circle>();
shapePtr->draw(); // 调用派生类的虚函数
// 另一个派生类
shapePtr = std::make_shared<Square>();
shapePtr->draw(); // 同样调用派生类的虚函数
// 在 main 函数结束时,std::shared_ptr 会自动销毁对象,调用相应的析构函数
return 0;
}
/*
root@PF34VVBR:/mnt/c/Users/User/Documents/test# g++ sharedptr_duotai.cpp -o sharedptr_duotai.o
root@PF34VVBR:/mnt/c/Users/User/Documents/test# ./sharedptr_duotai.o
Drawing a circle
Destroying a circle
Destroying a shape
Drawing a square
Destroying a square
Destroying a shape
*/
在这个例子中,Shape
是一个基类,Circle
和 Square
是派生类。通过使用 std::shared_ptr<Shape>
,我们可以在运行时指向 Circle
或 Square
对象,而不用担心手动释放内存。在std::shared_ptr
的析构函数中,它会调用正确的析构函数,这就是智能指针的强大之处。
这种方法还可以用于容器等数据结构,让你在使用多态的同时,充分发挥智能指针的便利性。