#### 22. 继承
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为**基类**,新建的类称为**派生类**。
继承代表了 **is a** 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
**基类 & 派生类:**
一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:
~~~
class derived-class: access-specifier base-class
复制代码
~~~
其中,访问修饰符 access-specifier 是 **public、protected** 或 **private** 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。
~~~
//1. 定义基类
class SuperMan {
public:
~SuperMan();
char *superName;
void setSuperName(char *superName);
char *getSuperName();
};
//2. 定义子类
class DevYK : public SuperMan {
public:
DevYK();
~DevYK();
char *getSupName();
};
//3. 测试
void test20() {
//子类
DevYK *devYkTemp = new DevYK();
//父类set Name
devYkTemp->setSuperName("superMan");
//子类获取
cout << "单继承:" << devYkMoreTemp->getPersonName();
}
复制代码
~~~
指针类型的访问需要以 “->” 形式来访问
> **输出:**
>
> 执行 DevYK 空参构造函数
>
> 单继承:superMan
**访问控制和继承:**
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。
我们可以根据访问权限总结出不同的访问类型,如下所示:
| 访问 | public | protected | private |
| --- | --- | --- | --- |
| 同一个类 | yes | yes | yes |
| 派生类 | yes | yes | no |
| 外部的类 | yes | no | no |
一个派生类继承了所有的基类方法,但下列情况除外:
* 基类的构造函数、析构函数和拷贝构造函数。
* 基类的重载运算符。
* 基类的友元函数。
**多继承:**
多继承即一个子类可以有多个父类,它继承了多个父类的特性。
C++ 类可以从多个类继承成员,语法如下:
~~~
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
复制代码
~~~
其中,访问修饰符继承方式是 **public、protected** 或 **private** 其中的一个,用来修饰每个基类,各个基类之间用逗号分隔,如上所示。现在让我们一起看看下面的实例:
~~~
//1. 定义基类 Person
class Person {
public: //公共的属性
Person();
~Person();
Person(char *name, char *gen, int age);
char *name;
char *gen;
int age;
void setName(char *name);
char *getName();
void setGen(char *gen);
char *getGen();
void setAge(int age);
int getAge();
};
//2. 定义基类 SuperMan
class SuperMan {
public:
~SuperMan();
char *superName;
void setSuperName(char *superName);
char *getSuperName();
};
//3. 派生类
/**
* 继承关系
* 多继承
*/
class DevYK : public Person, public SuperMan {
public:
DevYK(char *name, int age) : Person(name, "nan", age) {};
int length;
DevYK();
~DevYK();
char *getPersonName();
char *getSupName();
void setLength(int len);
int getLength();
char *getName();
};
//4. 测试
void test20() {
// //子类
DevYK *devYkTemp = new DevYK();
//父类set Name
devYkTemp->setName("DevYK");
//子类获取
cout << "单继承 Person Name:" << devYkTemp->getPersonName() << endl;
//多继承
DevYK *devYkMoreTemp = new DevYK();
//给父类 Person set Name
devYkMoreTemp->setName("DevYK");
//给父类 Super set Name
devYkMoreTemp->setSuperName("superMan");
//子类获取
cout << "多继承 Person Name:" << devYkMoreTemp->getPersonName()<< endl;
cout << "多继承 SuperMan Name:" << devYkMoreTemp->getSupName() << endl;
//释放内存
delete devYkTemp, devYkMoreTemp;
}
复制代码
~~~
> **输出:**
>
> 执行 Person 空参构造函数 执行 DevYK 空参构造函数 单继承 Person Name:DevYK 执行 Person 空参构造函数 执行 DevYK 空参构造函数 多继承 Person Name:DevYK 多继承 SuperMan Name:superMan DevYK 销毁 SuperMan 销毁 Person 销毁
- 前言
- JNI基础知识
- C语言知识点总结
- ①基本语法
- ②数据类型
- 枚举类型
- 自定义类型(类型定义)
- ③格式化输入输出
- printf函数
- scanf函数
- 编程规范
- ④变量和常量
- 局部变量和外部变量
- ⑤类型转换
- ⑥运算符
- ⑦结构语句
- 1、分支结构(选择语句)
- 2、循环结构
- 退出循环
- break语句
- continue语句
- goto语句
- ⑧函数
- 函数的定义和调用
- 参数
- 函数的返回值
- 递归函数
- 零起点学通C语言摘要
- 内部函数和外部函数
- 变量存储类别
- ⑨数组
- 指针
- 结构体
- 联合体(共用体)
- 预处理器
- 预处理器的工作原理
- 预处理指令
- 宏定义
- 简单的宏
- 带参数的宏
- 预定义宏
- 文件包含
- 条件编译
- 内存中的数据
- C语言读文件和写文件
- JNI知识点总结
- 前情回顾
- JNI规范
- jni开发
- jni开发中常见的错误
- JNI实战演练
- C++(CPP)在Android开发中的应用
- 掘金网友总结的音视频开发知识
- 音视频学习一、C 语言入门
- 1.程序结构
- 2. 基本语法
- 3. 数据类型
- 4. 变量
- 5. 常量
- 6. 存储类型关键字
- 7. 运算符
- 8. 判断
- 9. 循环
- 10. 函数
- 11. 作用域规则
- 12. 数组
- 13. 枚举
- 14. 指针
- 15. 函数指针与回调函数
- 16. 字符串
- 17. 结构体
- 18. 共用体
- 19. typedef
- 20. 输入 & 输出
- 21.文件读写
- 22. 预处理器
- 23.头文件
- 24. 强制类型转换
- 25. 错误处理
- 26. 递归
- 27. 可变参数
- 28. 内存管理
- 29. 命令行参数
- 总结
- 音视频学习二 、C++ 语言入门
- 1. 基本语法
- 2. C++ 关键字
- 3. 数据类型
- 4. 变量类型
- 5. 变量作用域
- 6. 常量
- 7. 修饰符类型
- 8. 存储类
- 9. 运算符
- 10. 循环
- 11. 判断
- 12. 函数
- 13. 数学运算
- 14. 数组
- 15. 字符串
- 16. 指针
- 17. 引用
- 18. 日期 & 时间
- 19. 输入输出
- 20. 数据结构
- 21. 类 & 对象
- 22. 继承
- 23. 重载运算符和重载函数
- 24. 多态
- 25. 数据封装
- 26. 接口(抽象类)
- 27. 文件和流
- 28. 异常处理
- 29. 动态内存
- 30. 命名空间
- 31. 预处理器
- 32. 多线程
- 总结
- 音视频学习 (三) JNI 从入门到掌握
- 音视频学习 (四) 交叉编译动态库、静态库的入门学习
- 音视频学习 (五) Shell 脚本入门
- 音视频学习 (六) 一键编译 32/64 位 FFmpeg 4.2.2
- 音视频学习 (七) 掌握音频基础知识并使用 AudioTrack、OpenSL ES 渲染 PCM 数据
- 音视频学习 (八) 掌握视频基础知识并使用 OpenGL ES 2.0 渲染 YUV 数据
- 音视频学习 (九) 从 0 ~ 1 开发一款 Android 端播放器(支持多协议网络拉流/本地文件)
- 音视频学习 (十) 基于 Nginx 搭建(rtmp、http)直播服务器
- 音视频学习 (十一) Android 端实现 rtmp 推流
- 音视频学习 (十二) 基于 FFmpeg + OpenSLES 实现音频万能播放器
- 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)