简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
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其实是基类和子类的关系,所以可以直接隐式转换。