目录
- 一、多态基础
- 虚函数
- 虚类/虚基类
- 重写/覆盖
- 多态的条件
- 继承遗留问题解决
- 题目1
- 题目2
- C++11 override和final
- 重载、覆盖(重写)、隐藏(重定义)的对比
- 纯虚函数
- 抽象类/纯虚类
- 接口继承和实现继承
- 二、多态原理
- 引入(多态的原理)
- 虚函数表指针
- 虚函数表/虚表
- 描述:
- 虚表的特性(单继承)
- 虚表的一般示例:
- 对象中的虚表指针在构造函数中初始化
- 虚表的位置
- 谈谈对象切片
- 谈谈多态的原理
- 虚表打印
- 多继承虚表
- 多继承下子类自己新增的虚函数在哪?
- 多继承虚表打印代码
- 结论与发现:
- this指针修正分析
- 虚表中地址(概念修正)
- 菱形继承+多态 与 菱形虚拟继承+多态
- 菱形继承+多态
- 菱形虚拟继承+多态(子类没有新增虚函数)
- 菱形虚拟继承+多态(子类自己新增了虚函数)
- 一些概念
- 动态绑定和静态绑定
- 内联函数inline 和 虚函数virtual
- 静态函数static 与 虚函数
- 构造函数、拷贝构造函数、赋值运算符重载 与 虚函数
- 虚函数和普通函数谁快?
一、多态基础
虚函数
在函数前加上virtual就是虚函数- class A{
- public:
- virtual void func(){}; //这是一个虚函数
- };
复制代码 虚函数的继承
虚函数的继承体现了接口继承
继承了接口等于继承了函数的壳,这个壳有返回值类型,函数名,参数列表,还包括了缺省参数
只需要重写/覆盖接口的实现(函数体)
虚类/虚基类
含有虚函数的类是虚类.
虚基类是虚拟继承体系中的基类,注意区分.
重写/覆盖
条件:
三同:函数名,参数(平常说的参数都是说参数的类型,与缺省参数无关),返回值都要相同
概念:
重写/覆盖是指该函数是虚函数且函数的名字、类型、返回值完全一样的情况下,子类的函数体会替换掉继承下来的父类虚函数的函数体
- 体现接口继承
- 重写/覆盖只有虚函数才有,非虚函数的是隐藏/重定义.注意区别
- 重写/覆盖只对函数体有效,返回值类型,函数名,参数列表,和缺省参数都不能修改
- 只要子类写上满足三同的虚函数都会触发重写.无论是否修改函数体
多态的条件
多态有两个条件,任何一个不满足都不能执行多态 ,分别是
多态的基础
[code] class Person { public: virtual void BuyTicket() { //是虚函数 std::cout |