父类的构造函数
◼ 子类的构造函数默认会调用父类的无参构造函数
◼ 如果子类的构造函数显式地调用了父类的有参构造函数,就不会再去默认调用父类的无参构造函数
◼ 如果父类缺少无参构造函数,子类的构造函数必须显式调用父类的有参构造函数
继承体系下的构造函数示例
![image.png](https://img.haomeiwen.com/i694108/
7b2e2f701f022b56.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
构造、析构顺序
◼ 构造和析构顺序相反
image.png
父类指针、子类指针
◼ 父类指针可以指向子类对象,是安全的,开发中经常用到(继承方式必须是public) ◼ 子类指针指向父类对象是不安全的
image.png
多态
◼ 默认情况下,编译器只会根据指针类型调用对应的函数,不存在多态
◼ 多态是面向对象非常重要的一个特性
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
在运行时,可以识别出真正的对象类型,调用对应子类中的函数
◼ 多态的要素
子类重写父类的成员函数(override)
父类指针指向子类对象
利用父类指针调用重写的成员函数
虚函数
◼C++中的多态通过虚函数(virtual function)来实现
◼ 虚函数:被virtual修饰的成员函数
◼ 只要在父类中声明为虚函数,子类中重写的函数也自动变成虚函数(也就是说子类中可以省略virtual关键字)
虚表
◼ 虚函数的实现原理是虚表,这个虚表里面存储着最终需要调用的虚函数地址,这个虚表也叫虚函数表
image.png
虚表(x86环境的图)
image.png◼ 所有的Cat对象(不管在全局区、栈、堆)共用同一份虚表
网友评论