C++之类继承隐式转换实例(二百五十七)

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:在看Android音频混音部分时,被一个代码隐式转换搞蒙了,提取出其抽象源码,其实很简单,分享给大家。

2.C++继承介绍

  • 类继承是面向对象编程中的一个核心概念,它允许程序员定义一个基类(或称为父类)和从该基类派生出来的子类。子类继承父类的属性和方法,同时可以添加自己的新属性和方法。隐式转换(或称为自动类型转换)是在类继承层次结构中,子类对象可以自动地被当作父类对象使用的过程。

  • 在类继承中,子类是一种特殊的父类,即“is-a”关系。这意味着,如果一个类继承自另一个类,那么子类对象就可以被视为父类对象的一种。因此,在需要将子类对象传递给期望父类对象的函数或方法时,不需要进行显式的类型转换,编译器会自动进行隐式转换。

  • 隐式转换的原理在于,子类对象在内存中包含了父类对象的所有信息。这是因为子类对象在构造时会调用父类的构造函数来初始化父类部分的数据成员。因此,当子类对象被当作父类对象使用时,编译器知道如何正确地访问父类部分的成员。

  • 隐式转换提高了代码的灵活性和可重用性。它允许程序员编写以父类为参数的通用代码,这些代码可以处理任何从父类派生的子类对象。同时,隐式转换也减少了显式类型转换的需要,简化了代码并降低了出错的可能性。

  • 然而,需要注意的是,隐式转换只适用于从子类到父类的转换,而不适用于从父类到子类的转换。从父类到子类的转换通常需要进行显式的类型转换,因为父类对象可能不包含子类添加的新成员。此外,隐式转换也可能会引起一些潜在的问题,比如对象切片,因此在使用时需要谨慎。

3.代码实例

#include <iostream>

class AudioBufferProvider {};

class ExtendedAudioBufferProvider : public AudioBufferProvider {};
class TrackBase : public ExtendedAudioBufferProvider {};

class Track : public TrackBase {
public:
  AudioBufferProvider* mInputBufferProvider;
};

Track *mtrack ;

void setBufferProvider(AudioBufferProvider* provider) {
  mtrack->mInputBufferProvider = provider;
  printf("继承隐式转换.\n");
}

int main() {

  mtrack = new Track;
  setBufferProvider(mtrack);
  return 0;
}

这里根本目的传入Track指针,但是接收的是AudioBufferProvider指针类型,怎么做到的呢?当然,这里很简单,在代码中可能把人绕晕菜。
可以看到Track的父类是TrackBase,TrackBase的父类是ExtendedAudioBufferProvider,ExtendedAudioBufferProvider的父类是AudioBufferProvider,所以Track类和AudioBufferProvider其实是基类和子类的关系,所以可以直接隐式转换。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应急响应-流量分析

在应急响应中&#xff0c;有时需要用到流量分析工具&#xff0c;。当需要看到内部流量的具体情况时&#xff0c;就需要我们对网络通信进行抓包&#xff0c;并对数据包进行过滤分析&#xff0c;最常用的工具是Wireshark。 Wireshark是一个网络封包分析软件。网络封包分析软件的…

全连MGRE(OSPF)综合实验

一.要求 二.底层--所有节点拥有合法ip地址 r1: r2&#xff08;isp&#xff09;: r3: r4: r5: r6: 三.全网可达 r1: r3&#xff1a; r4: r5: r6: 四.构建全连的MGRE环境 R1-R3-R4 R1&#xff1a; r3: r4: R1-R5-R6 r1: r5: r6: 五.ospf配置 R1&#xff1a; r3: r4: r5: r6:…

Linux下安装edge

edge具有及其强大的功能&#xff0c;受到很多人的喜爱&#xff0c;它也开发Linux版本&#xff0c;下面是安装方法&#xff1a; 1.去edge官网下载Linux(.deb)文件。 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ 2.下载之后输入以下指令&#xff08;后面是安装…

Docker私有仓库搭建

目录 搭建本地私有仓库 Docker--harbor私有仓库部署与管理 Harbor 简介 什么是Harbor Harbor的特性 Harbor的构成 Harbor 部署 部署 Docker-Compose 服务 ​编辑部署 Harbor 服务 启动 Harbor 进入浏览器http://192.168.20.10进入harbor的客户端 搭建本地私有仓库 …

如何本地搭建Tale博客网站并发布到公网分享好友远程访问——“cpolar内网穿透”

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

【linux】磁盘相关命令fdisk/lsblk和file

1. fdisk 磁盘分区&#xff0c;查看系统分区。 fdisk 的意思是 固定磁盘(Fixed Disk) 或 格式化磁盘(Format Disk)&#xff0c;它是命令行下允许用户对分区进行查看、创建、调整大小、删除、移动和复制的工具。它支持 MBR、Sun、SGI、BSD 分区表&#xff0c;但是它不支持 GUI…

Nginx实现反向代理负载均衡实验

实验环境&#xff1a; VM REdhat虚拟机&#xff08;192.168.87.5&#xff09;一台、VM Redhat虚拟机&#xff08;192.168.87.3&#xff09;一台、阿里云服务器&#xff08;47.93.79.92&#xff09;一台 实验要求&#xff1a;通过windows浏览器访问192.168.87.5&#xff08;虚…

Hugging Face创始人分享:企业如何在ChatGPT浪潮下实现战略布局

Hugging Face创始人兼首席执行官 Clem Delangue在IBM一年一度的 THINK大会中研讨了当前人工智能发展趋势&#xff0c;特别是ChatGPT模型以及其对行业的影响。他的演讲还涉及到一个关键的议题&#xff0c;在ChatGPT这样的通用模型出现后&#xff0c;企业如何在人工智能领域找到自…

window下如何安装ffmpeg(跨平台多媒体处理工具)

ffmpeg是什么? FFmpeg是一个开源的跨平台多媒体处理工具&#xff0c;可以用于录制、转换和流媒体处理音视频。它包含了几个核心库和工具&#xff0c;可以在命令行下执行各种音视频处理操作&#xff0c;如剪辑、分割、合并、媒体格式转换、编解码、流媒体传输等。FFmpeg支持多…

应急响应-威胁情报

在应急响应中&#xff0c;威胁情报类似一个多维度的知识库&#xff0c;可以对以往相似的恶意元素进行查询。很多时候&#xff0c;结合威胁情报可以从对维度快速地了解攻击者的信息。SANS研究院对威胁情报的定义是&#xff0c;针对安全威胁、威胁者、利用、恶意软件、漏洞和危害…

写在28岁,回看3年前“啃老”的自己,庆幸当时入了软件测试这行

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 为什么会学习软件测试&#xff1f; 已经28岁了&#xff0c;算一下快过去3年了&#xff0c;刚…

图片中的水印怎么去掉?教你三个去水印方法

在拍摄照片时&#xff0c;有时候会遇到不期而遇的路人出现在镜头中&#xff0c;给照片带来不必要的干扰。这时候我们就需要把路人给去掉&#xff0c;让照片变的更加完美。下面我将给大家分享三个把照片中的路人去掉的小妙招。 一、水印云 水印云是一款非常实用的图片处理工具…

CMS网站渗透-Server2206-(解析+环境)

B-5&#xff1a;CMS网站渗透 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2206&#xff08;关闭链接&#xff09;服务器场景操作系统&#xff1a;未知 1.使用渗透机对服务器信息收集&#xff0c;并将服务器中网站服务端口号作为flag提交&#xff1b; 2.使用渗透机…

海外云手机三大优势

在全球化潮流下&#xff0c;企业因业务需求对海外手机卡等设备的需求不断攀升&#xff0c;推动了海外云手机业务的蓬勃发展。相较于自行置备手机设备&#xff0c;海外云手机不仅能够降低成本&#xff0c;还具备诸多优势&#xff0c;让我们深入探讨其中的三大黄金优势。 经济实惠…

Armv8-M的TrustZone技术之测试目标指令

为了允许软件确定内存位置的安全属性,使用了TT指令(Test Target)。 Test Target(TT)查询内存位置的安全状态和访问权限。 Test Target Unprivileged(TTT)查询内存位置的安全状态和访问权限,以进行对该位置的非特权访问。 Test Target Alternate Domain(TTA)和Test…

新火种AI|Taylor Swift不雅照被疯传!AI背后的隐患和危机引人深思...

作者&#xff1a;小岩 编辑&#xff1a;彩云 如今本就是一个信息爆炸的年代&#xff0c;再伴随2023年AI技术的井喷式发展&#xff0c;AI正在以迅雷不及掩耳之势渗透到我们生活的方方面面。不过&#xff0c;AI技术是一把双刃剑&#xff0c;我们在享受AI技术带来的便捷和实用的…

算法沉淀——二分查找(leetcode真题剖析)

算法沉淀——二分查找 01.二分查找02.在排序数组中查找元素的第一个和最后一个位置03.搜索插入位置04.x 的平方根05.山脉数组的峰顶索引06.寻找峰值07.寻找旋转排序数组中的最小值08.LCR 173. 点名 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元…

SpringBoot项目实现热部署的配置方法

SpringBoot项目实现热部署的配置方法 1、什么是热部署&#xff1f; 热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。 2、什么是SpringBoot热部署&#xff1f; SpringBoot热部署就是在项目正在运行的时候修改代码, 却不需要重新启动…

SSD详解

1 SSD介绍 Single Shot MultiBox Detector(SSD, 单步多框 目标检测) 2 SSD结构 SSD 基础网络结构使用VGG 全部结构如下&#xff1a; 重用Faster R-CNN的Anchors机制&#xff0c;在feature map上提取各种不同尺度大小的default box&#xff0c;也就是类似Anchor的一系列大小固…

(七)for循环控制

文章目录 用法while的用法for的用法两者之间的联系可以相互等价用for改写while示例for和while的死循环怎么写for循环见怪不怪表达式1省略第一.三个表达式省略&#xff08;for 改 while&#xff09;全省略即死循环&#xff08;上面已介绍&#xff09; 用法 类比学习while语句 …