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