- 继承
子类继承了父类的成员函数和成员变量,也就是继承了除构造函数和析构函数之外的所有成员。 - 多态
相当于一个接口,基类的指针指向基类的对象时就调用基类的函数,基类的指针指向派生类的对象时,调用的是派生类的的函数。
(1)静多态(静态绑定/早绑定):模板,重载
编译时期确定调用哪个类型对象的函数
(2)动多态(动态绑定/晚绑定):继承+虚函数
运行时期确定调用哪个类型对象的函数
(通过寻找vfptr–>找到vftable–>再找到虚函数地址,进行调用,这些都是发生在运行阶段)
虚函数重点!
(1)如果一个类里面有虚函数,那么这个类生成的对象会多出4个字节(vfptr)
一个类有一个或多该个虚函数只生成一个vfptr,对象只多了4个字节,但是虚函数越多,虚函数表就越大。
(2)类的虚函数表是在编译过程中就生成好的,一个类只有一张虚函数表(虚函数表的个数和类对应,而不是和对象对应。同一类定义的所有对象的vfptr是指向同一个虚函数表的)
(3)虚函数运行时,存放在 .rodata段,叫做只读数据段(只允许读,不允许修改)
虚函数的必要条件:
(1)虚函数的地址要存在虚函数表里,因此必须要能产生函数符号的地址,所以内联函数就不能成为virtual函数
(2)只能通过对象的前四个字节vfptr才能访问虚函数表,进而访问虚函数地址,虚函数必须要以来对象,所以构造函数不能成为虚函数
(3)static也不能实现虚函数:static修饰的成员不依赖对象 - 封装
封装可以隐藏实现细节,使代码模块化。
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
- 虚函数的作用
如果派生类从写了一遍基类的函数,没有虚函数的时候只能访问基类方法,有虚函数的时候既能访问基类,也能访问派生类。
https://www.cnblogs.com/shijingjing07/p/5564812.html
4.纯虚函数
在什么情况下使用纯虚函数(pure vitrual function)?
1,当想在基类中抽象出一个方法,且该基类只做能被继承,而不能被实例化;
2,这个方法必须在派生类(derived class)中被实现;