第十五章 面向对象程序设计
继承
可以在类名后面加上final关键词, 表示该类不能作为基类(不能被继承)
可以将基类的指针或引用指向派生类对象, 即基类指针和引用的静态类型和动态类型不一定相同(只有指针和引用可能发生这种情况, 通过对象进行的函数调用, 静态类型和动态类型是一样的!)
静态类型: 变量或表达式在声明或运算时的类型, 编译时已知
动态类型: 变量或表达式在内存中对应的类型, 运行时才知道
友元关系不能继承
派生访问说明符
public, 不修改基类的成员访问权限
protected, 把基类public的成员变为protected
private, 把基类所有成员变为private
派生访问符还会影响能否从派生类转化为基类
- 可以通过派生类对象的基类部分(公有成员)在目标代码中是否可见来判断
可以使用using改变基类中部分(可见)成员的访问权限
- struct 默认public继承; class默认private继承
基类
- 通常需要定义一个虚析构函数
- 被用作基类的类必须已经定义, 而不仅仅是声明
派生类
- 需要使用派生列表声明自己是从哪个(哪些)基类继承而来, 首先是一个冒号, 然后是一组逗号分隔的基类, 每个基类前可以有一个访问说明符
- 可以将派生类抽象分为两部分, 一部分来自基类成员, 一部分是自己特有的成员
- 派生类在初始化列表中初始化基类部分成员(利用基类的构造函数)
- 派生类需要提供新定义来覆盖(override)基类继承而来的旧定义
- 派生类构造函数只能初始化它的直接继承类
虚函数
关键词-virtual, 可以进行动态绑定
只能出现在类内部的声明之前
任何非构造函数的非静态函数都可以是虚函数
一般情况, 若派生类的函数覆盖了基类的虚函数, 它们的形参列表, 返回类型必须完全一致
虚函数的形参也可以有默认实参值, 但是函数调用时使用的默认实参与静态类型有关, 而不是动态类型
- 基类和派生类的默认实参值最好保持一致
可以使用作用域运算符来略过动态绑定的过程, 强行使用某个特定版本
用=0代替函数体, 可以声明纯虚函数
抽象基类
- 含有纯虚函数的类是抽象基类, 对应java中接口(interface)的概念
- 不能直接创建一个抽象基类的对象
protected访问控制
protected成员, 对类的用户是不可见的
对派生类的成员和友元是可见的
- 派生类的成员和友元只能通过派生类对象来访问protected成员, 但对基类对象的protected成员不具有访问权限. (即使D继承了B, 但是D类访问不了B对象中的protected成员)
- Title: 第十五章 面向对象程序设计
- Author: Huan Lee
- Created at : 2023-08-20 14:15:16
- Updated at : 2024-02-26 04:53:15
- Link: https://www.mirthfullee.com/2023/08/20/notion-第十五章 面向对象程序设计-09cd4bf4/
- License: This work is licensed under CC BY-NC-SA 4.0.