一、多态的意义
- 针对同一种行为,表现出了多种形态
- 多继承解决了
多个父类中的重复成员只需要保留一份
的问题
二、多态实现的前提——赋值兼容
- 必须public继承才能使用
多态
赋值兼容只会发生在
公有派生
的父子关系
中
- 子类对象赋给父类的对象
- 子类对象赋给父类的引用
- 子类对象的地址赋给父类的指针
三、函数重载是静多态
相同的函数名,不同的参数列表
在
函数重载的本质编译
的时候其实就把函数名改变了——
四、动多态
4.1 如何证明动多态不是在编译时确定的
动多态在运行时确定的证明4.2 override
- overload——同一个作用域中,函数名相同,参数列表不同
- shadow——发生在父子类中的同名成员(数据or函数)
- override——发生在
父子类
中,父类中函数有virtual声明的函数,在子类中,同参,同名,同返回
的返回,二者之间构成了override。
- 多态在涉及到
赋值兼容
的时候,用得最多的还是指针
。 - 虚函数的访问权限,并不一定一定要跟父类一样是
public
,也可以是private或protected,具体看子类的需求。
五、纯虚函数
- 拥有纯虚函数的类称为
抽象基类
,这个抽象基类是不可以实例化对象
的
作用是
提供族类的公共接口
。
- 纯虚函数也不可以进行实现,但是可以进行重写。
-
虚基类
是在多继承中的,里面有一个虚继承
六、含有虚函数的析构
6.1 栈上的构造与析构
栈上的构造和析构栈上的构造和析构的结果
- 这个构造和析构的顺序与我们预想的一样
6.2 堆上的构造与析构
堆上的相应操作堆上的相应操作的结果
可以看到,没有
~Dog()
,说明析构不完全。那么如何析构完全呢?
- 答案是引入
虚析构
6.3 虚析构
- 虚析构——就是为了
析构完全
,在delete父类指针
的时候,将子类对象
析构完全(调用子类的析构器
)。
虚析构
6.4 静态函数不能是虚函数
因为要实现多态
,一定要有对象
。但是静态函数属于类,不属于对象
6.5 内联函数不能是虚函数
- 虚函数是动态的
- 内联函数是要被内嵌的,是在编译时候搞的。
网友评论