C++之智能指针类型转换应用总结(二百二十九)

news2024/11/25 2:28:47

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之std::static_pointer_cast智能指针类型转换应用。

在C++中,std::static_pointer_cast是一种智能指针类型转换函数,用于将一个 std::shared_ptr 智能指针转换为另一种相关类型的智能指针。它的作用是在类型转换时保持智能指针的引用计数,确保资源的正确释放。

std::static_pointer_cast函数的用法如下所示:

std::shared_ptr<Derived> derivedPtr = std::static_pointer_cast<Derived>(basePtr);

其中Derived是目标类型,basePtr是指向基类类型的std::shared_ptr智能指针。该函数将basePtr转换为Derived类型的智能指针derivedPtr

std::static_pointer_cast的原理是使用了C++中的RTTI(Run-Time Type Information)机制,通过检查指针指向的对象的实际类型,并进行相应的类型转换操作。

std::static_pointer_cast通常用在需要将基类类型的智能指针转换为派生类类型的智能指针的场合。它可以方便地进行基类指针到派生类指针的安全转换,同时保持智能指针的引用计数,避免资源泄漏和多次释放的问题。

2.应用实例

v1.0 派生类指针向基类指针的转换

#include <iostream>
#include <memory>

class Base {
public:
    virtual void print() {
        std::cout << "Base" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived" << std::endl;
    }
};

int main() {
    std::shared_ptr<Derived> derivedPtr = std::make_shared<Derived>();
    std::shared_ptr<Base> basePtr = std::static_pointer_cast<Base>(derivedPtr);

    basePtr->print(); // 输出: Derived

    return 0;
}

v2.0 将基类指针转换为派生类指针

#include <iostream>
#include <memory>

class Base {
public:
    virtual void print() {
        std::cout << "Base" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived" << std::endl;
    }
};

int main() {
    std::shared_ptr<Base> basePtr = std::make_shared<Derived>();
    std::shared_ptr<Derived> derivedPtr = std::static_pointer_cast<Derived>(basePtr);

    derivedPtr->print(); // 输出: Derived

    return 0;
}

v3.0 将const指针转换为非const指针

#include <iostream>
#include <memory>

class Base {
public:
    void print() {
        std::cout << "Base" << std::endl;
    }
};

int main() {
    std::shared_ptr<const Base> constBasePtr = std::make_shared<const Base>();

    std::shared_ptr<Base> basePtr = std::const_pointer_cast<Base>(constBasePtr);
    basePtr->print(); // 输出: Base

    return 0;
}

v4.0 将shared_ptr转换为weak_ptr

#include <iostream>
#include <memory>

class Base {
public:
    void print() {
        std::cout << "Base" << std::endl;
    }
};

int main() {
    std::shared_ptr<Base> basePtr = std::make_shared<Base>();

    std::weak_ptr<Base> weakBasePtr = std::static_pointer_cast<std::weak_ptr<Base>>(basePtr.lock());

    std::shared_ptr<Base> sharedBasePtr = weakBasePtr.lock();
    sharedBasePtr->print(); // 输出: Base

    return 0;
}

v5.0 将shared_ptr转换为unique_ptr

#include <iostream>
#include <memory>

class Base {
public:
    void print() {
        std::cout << "Base" << std::endl;
    }
};

int main() {
    std::shared_ptr<Base> basePtr = std::make_shared<Base>();

    std::unique_ptr<Base> uniqueBasePtr = std::static_pointer_cast<std::unique_ptr<Base>>(std::move(basePtr));

    uniqueBasePtr->print(); // 输出: Base

    return 0;
}

v6.0 将shared_ptr转换为shared_ptr的基类

#include <iostream>
#include <memory>

class Base {
public:
    virtual void print() {
        std::cout << "Base" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived" << std::endl;
    }
};

int main() {
    std::shared_ptr<Derived> derivedPtr = std::make_shared<Derived>();
    std::shared_ptr<Base> basePtr = std::static_pointer_cast<Base>(derivedPtr);

    basePtr->print(); // 输出: Derived

    std::shared_ptr<Derived> derivedPtr2 = std::static_pointer_cast<Derived>(basePtr);
    derivedPtr2->print(); // 输出: Derived

    return 0;
}

v7.0 多重继承中的指针转换

#include <iostream>
#include <memory>

class Base1 {
public:
    virtual void print() {
        std::cout << "Base1" << std::endl;
    }
};

class Base2 {
public:
    virtual void print() {
        std::cout <<"Base2" << std::endl;
    }
};

class Derived : public Base1, public Base2 {
public:
    void print() override {
        std::cout << "Derived" << std::endl;
    }
};

int main() {
    std::shared_ptr<Derived> derivedPtr = std::make_shared<Derived>();

    std::shared_ptr<Base1> base1Ptr = std::static_pointer_cast<Base1>(derivedPtr);
    base1Ptr->print(); // 输出: Derived

    std::shared_ptr<Base2> base2Ptr = std::static_pointer_cast<Base2>(derivedPtr);
    base2Ptr->print(); // 输出: Derived

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构:线性表之-队列

目录 什么是队列&#xff1f; 详解&#xff1a; 功能介绍 代码实现 定义队列基本结构 1&#xff0c;初始化 2, 销毁 3,尾入数据 4,头出数据 5,取队头的数据 6,取队尾的数据 7,判断是否为空 8,计算队列中的元素 成品 Queue.h Queue.c test.c 队列的讲解将建立在…

Oracle使用遇到的问题

一、Navicat 连接Orcle提示 Oracle library is not loaded 1.前往官网下载客户端 http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html 2.选择与系统匹配的“Instant Client”和sqlpus。

App的专项测试

文章目录 App的专项测试都从哪个方面测试安装和卸载版本升级消息推送弱网测试兼容性测试交互性测试 App的专项测试都从哪个方面测试 在APP测试过程中&#xff0c;除了功能测试外&#xff0c;还需要进行一些专项测试来发现更为深层的问题&#xff0c;这些问题主要是针对某个特殊…

时空智友企业流程化管控系统文件存在任意文件上传漏洞 附POC

、 文章目录 时空智友企业流程化管控系统文件存在任意文件上传漏洞 附POC1. 时空智友企业流程化管控系统文件简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 时空智友企业流程化管控系统文件存在任意文件上传漏洞 附POC 免责声明&#…

【Redis】深入探索 Redis 的哨兵(Sentinel)机制原理,基于 Docker 模拟搭建 Redis 主从结构和哨兵分布式架构

文章目录 一、对 Redis Sentinel 的认识1.1 什么是 Redis Sentinel1.2 为什么要使用 Redis Sentinel1.2.1 主从复制问题1.2.2 人工恢复主节点故障 二、Redis Sentinel 原理剖析2.1 Redis Sentinel 架构2.2 Raft 算法和领袖节点2.3 哨兵节点2.4 故障检测2.5 故障切换2.6 监控和通…

Android调用相册并展示选中的图片

调用相册 //定义请求码int PICK_PHOTO_REQUEST 1234;int RESULT_CANCELED 0;//定义取消码//触发监听后调用相册findViewById(R.id.image_gallery).setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {//创建一个意图并开启startActivi…

Visual Studio 2017 安装

C自学精简实践教程 目录(必读) 这篇文章会保证你第一次安装VS2017就成功运行Hello World! 下载Visual Studio Installer Gitee 下载 VS2017/vs2017_Community.exe CalmReason/VisualStudio - 码云 - 开源中国 (gitee.com) 百度云下载 链接&#xff1a;https://pan.baidu…

ArangoDB关键知识点汇总大全(不定时更新)

二、ArangoDB数据模型与索引 2.1 数据模型 ArangoDB的数据模型分为数据库(databse)、集合(collection)、文档(document)&#xff0c;分别与RDBMS中的数据库、表、行对应。 数据类型包括&#xff1a;string、boolean、number、array、document/object Collection&#xff1a…

【详细图文】Windows下安装RustRover和配置Rust环境

前言 Rust已经火了挺长时间了&#xff0c;连微软的Windows内核都用它来重新改写&#xff0c;可想而知其厉害之处。之前有看过Rust的教程&#xff0c;但一直没有去尝试。今天看到JetBrains出了Rust 专用的IDE&#xff1a;RustRover。作为JetBrains的粉丝&#xff0c;决定进行一…

【强化学习】02—— 探索与利用

文章目录 1. 探索与利用2. 探索策略3. 多臂老虎机3.1. 形式化描述3.2. 估计期望奖励3.3. 懊悔regret函数 4. 贪心策略和 ϵ − g r e e d y \epsilon-greedy ϵ−greedy策略5. 积极初始化6. 显示地考虑动作的价值分布7. UCB上置信界算法8. 汤普森采样算法总结参考 1. 探索与利用…

Hive 的权限管理

目录 ​编辑 一、Hive权限简介 1.1 hive中的用户与组 1.1.1 用户 1.1.2 组 1.1.3 角色 1.2 使用场景 1.2.1 hive cli 1.2.2 hiveserver2 1.2.3 hcatalog api 1.3 权限模型 1.3.1 Storage Based Authorization in the Metastore Server 1.3.2 SQL Standards Based …

【Vue.js】vue-cli搭建SPA项目并实现路由与嵌套路由---详细讲解

一&#xff0c;何为SPA SPA&#xff08;Single Page Application&#xff09;是一种 Web 应用程序的开发模式&#xff0c;它通过使用 AJAX 技术从服务器异步加载数据&#xff0c;动态地更新页面内容&#xff0c;实现在同一个页面内切换不同的视图&#xff0c;而无需整页刷新 1.…

部署Kafka

kafka&#xff1a;kafka_2.13-3.5.1 NOTE: Your local environment must have Java 8 installed. Apache Kafka can be started using ZooKeeper or KRaft. To get started with either configuration follow one the sections below but not both. 1 Windows单机 1.1 Kafka w…

wx.canvasToTempFilePath导出的图片不清晰

使用wx.canvasToTempFilePath接口&#xff0c;导出的canvas图片在手机上看不清晰 解决办法&#xff1a;本质上就是生成一个更大的图片&#xff0c;因为手机的屏幕设备的像素比现在一般都是超过2的。实际上我们只需要在使用wx.canvasToTempFilePath的时候&#xff0c;设置参数d…

LabVIEW在运行时调整表控件列宽

LabVIEW在运行时调整表控件列宽 如何在LabIEW中运行时调整表控件的列宽大小&#xff1f; 在VI运行时&#xff0c;有两种不同的方法可以更改表中列的宽度。首先&#xff0c;可以使用鼠标手动更改它们;其次&#xff0c;可以从框图中以编程方式更改它们。 手动更改列宽 只有在…

Unity中UI组件对Shader调色

文章目录 前言一、原理在Shader中直接暴露的Color属性&#xff0c;不会与UI的Image组件中的Color形成属性绑定。因为UI的Image组件中更改的颜色是顶点颜色&#xff0c;如果需要在修改组件中的颜色时&#xff0c;使Shader中的颜色也同时改变。那么就需要在应用程序阶段传入到顶点…

Docker容器启动失败:找不到映像

Docker容器启动失败&#xff1a;找不到映像 Docker容器启动失败&#xff1a;找不到映像摘要 &#x1f615;引言 &#x1f62e;正文 &#x1f913;为什么会找不到映像&#xff1f; &#x1f615;1. 映像不存在2. 映像标签错误3. 映像不兼容 如何预防和解决问题&#xff1f; &…

国家开放大学 考试试题训练

经济数学基础 参考 试题 导数基本公式&#xff1a; 积分基本公式&#xff1a; c0 ∫0dxc xaaxa-1 ∫xadxxa1a1c&#xff08;a≠-1&#xff09; axaxlna(a>0且a≠1) …

大转盘抽奖活动制作流程,让你轻松打造火爆营销活动

抽奖活动一直是商家吸引顾客、推广产品的利器之一。而如何让抽奖活动更加顺利、高效地进行呢&#xff1f;今天我们就要介绍的就是乔拓云平台&#xff0c;通过它&#xff0c;商家可以轻松地制作、发布抽奖活动&#xff0c;让您的营销更加便捷、迅速&#xff01;以下是具体操作步…

总结 HTTP 协议的基本格式和 fiddler 的用法

HTTP基本格式 HTTP协议也是日常开发中非常常用的的一种协议&#xff0c;在众多协议栈里HTTP可能是实际开发中用的最多的。 注意 这里说的HTTP是指HTTP1以及HTTP2&#xff0c;他们都是基于TCP协议的&#xff0c;注意&#xff1a;如今最新版的HTTP3是基于UDP的。 但如今在互联网…