多态
C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对 同一消息 会作出不同的响应。
多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统 升级,维护,调试的工作量和复杂度.
C++中通过virtual关键字对多态进行支持
使用virtual声明的函数被重写后即可展现多态特性
赋值兼容(多态实现的前提)
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的 对象来替代
赋值兼容是一种默认行为,不需要任何的显示的转化步骤。
赋值兼容规则中所指的替代包括以下的情况:
︎派生类的对象可以赋值给基类对象。 ︎
派生类的对象可以初始化基类的引用。 ︎
派生类对象的地址可以赋给指向基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
多态成立的条件
多态是设计模式的基础,多态是框架的基础
静态联编和动态联编
1、联编是指一个程序模块、代码之间互相关联的过程。
2、静态联编(static binding)是程序的匹配、连接在编译阶段实现,也称为 早期匹配。重载函数使用静态联编 (编译时)
3、动态联编是指程序联编推迟到运行时进行,所以又称为 晚期联编(迟绑定)。switch语句和 if语句是动态联编的例子(程序执行时)
虚析构函数
构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数。
析构函数可以是虚的。虚析构函数用于指引delete运算符正确析构动态对象。
重载、重写、重定义
重载(添加):同一个类,函数名相同,函数参数列表不同(参数类型,参数个数,参数顺序)
重写(覆盖):不同类(基类与派生类),函数名相同,参数相同,基类必须有virtual
重定义(隐藏):不同类(基类与派生类),函数名相同,
参数不同,不管基类有无virtual,基类的函数被隐藏
参数相同,但基类没有virtual,基类的函数被隐藏
多态的实现原理
虚函数表和vptr指针
C++编译器提前布局,在类对象中增加vptr指针,虚函数入口地址存虚函数表
C++编译器并不是区分子类对象和父类对象,而是根据对象指针找 vptr指针,再找虚函数入口,实现迟绑定,支持了多态
如果调用一个普通函数,编译器根本就不会查找虚函数表
当调用了虚函数,编译器才会查找虚函数表
vptr指针式分步初始化的
指针步长
父类指针和子类指针的步长
证明vptr指针的存在
检测类的大小就可以发现