std::shared_ptr 和多态的组合使用//test ok

在 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的析构函数中,它会调用正确的析构函数,这就是智能指针的强大之处。

这种方法还可以用于容器等数据结构,让你在使用多态的同时,充分发挥智能指针的便利性。

相关推荐
路灯上の马陈9 小时前
二叉树的定义与性质
数据结构·二叉树·树结构·1024程序员节
Bshaya_12 小时前
红黑树详解:概念、规则与插入实现
数据结构·红黑树·二叉搜索树·平衡树·插入逻辑
WBluuue13 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
路灯上の马陈14 小时前
数据结构-树
数据结构·1024程序员节
benjormin14 小时前
Java数据结构 二叉搜索树
数据结构·算法
H.莓飛18 小时前
【数据结构】排序总结与规模实测
linux·服务器·开发语言·数据结构·visual studio·1024程序员节
码少女19 小时前
数据结构——B+树基础
数据结构·b树
揽星河..21 小时前
【初阶数据结构】常见的排序算法
数据结构·排序算法·1024程序员节
YLCHUP1 天前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
啊啊啊啊啊!!!!1 天前
【c++】⽤哈希表封装myunordered_map和myunordered_set
数据结构·哈希算法·散列表