c++四个重要特征:抽象、封装、继承、多态
6.1 多态性的概念
1.)具有不同功能的函数可以用同一个函数名。
2.)多态性分为静态和动态多态性
静态多态性:编译时;实现方式:函数重载、运算符重载。
动态多态性:运行时;在程序运行过程中根据具体情况来确定调用哪一个;实现方式:虚函数。
3.)继承类为实现多态性提供两个条件
基类指针既可以访问基类成员,又可以访问派生类成员(不能访问到派生类新增成员);
在派生类中可以定义同原型而操作不同的成员函数;
4.)想利用基类指针去访问派生类成员,引入虚函数(动态连接)
6.3 虚函数
1.)虚函数是一种非静态的成员函数;
2.)虚函数说明格式:
virtual 类型 函数名 (参数表)
3.)虚函数特征:
虚函数在积累和派生类中说明【相同而实现不同】的成员函数。
基类中说明的虚函数会下传给派生类。(基类和派生类的同名函数,会去调用派生类的函数)
构造函数不能变成虚函数,析构函数可以变成虚函数。
如:
2.虚函数的实现原理(虚函数表)
1.)定义了虚函数的基类增加了一个存放虚函数调用地址的函数指针表virtualtable。该表的首地址由基类的内部指针vptr指示。
2.)派生类从基类中继承虚表virtualtable和指针vptr。
3.)如果虚函数在派生类中被重新定义,则虚表virtualtable的调用地址被重新定义的调用地址替换。否则仍然使用直接基类虚函数的调用地址。(对于和基类同名的函数,派生类有则更改,无则保持)
4.)多态性是由基类指针动态指向,由vptr和virtualtable的相应调用地址实现。
3.声明虚函数
1.)只能用virtual声明类的成员函数。
2.)同一类中,不能同时存在一个virtual和一个非virtual的【有相同参数和相同返回类型的同名函数】。
3.)虚函数所在类需要作为基类
4.)通过基类指针去引用虚函数。
5.)有时定义虚函数的函数体是空的。
4.虚析构函数
1.)为什么需要虚析构函数
可能需要通过基类指针删除派生类对象;
如果允许其他人通过基类指针调用对象的析构函数,需要让基类指针的析构函数成为虚函数。
构造函数不会是虚函数;析构函数可以是虚函数。
5 多态性小结
多态性模拟了客观世界中对象行为的多样性
可分为编译时多态性和运行时多态性
运行时多态性主要通过虚函数技术实现
虚函数使用virtual定义,且派生类的虚函数和基类的虚函数保持原型
虚函数使用虚函数表实现运行时多态性
6.4 纯虚函数与抽象类
1.)基类中的虚函数只是一个入口,具体的目的由不同的派生类对象决定,这个虚函数叫纯虚函数。
2.)定义格式:
virtual 类型 函数名 (参数表)=0;//以;结尾
3.)具有纯虚函数的类,叫抽象类。
纯虚函数没有办法被调用;没有函数体;