第十二章 多态与虚函数
一、多态的概念
向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为
具有不同功能的函数名可以用同一个函数名,以实现用一个函数名调用不同内容的函数
*静态多态和动态多态(编译时的多态性和运行时的多态性)
静态多态的特点:调用速率快、效率高,但缺少灵活性,在程序运行前就已经决定了执行的函数和方法
动态多态的特点:不在编译时确定调用的是哪个函数,只有在程序运行时才动态确定操作所针对的对象。动态多态是通过虚函数实现的。
二、利用虚函数实现动态多态性
*虚函数的作用
函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生层次的同名函数问题,前者是横向重载,后者可以理解成是纵向重载。(不同点:同一类族虚函数首部是相同的,而函数重载时的函数是不同的(这里指函数参数个数或类型不同))
*静态关联与动态关联(早期关联与滞后关联)
*虚函数声明
1.只能用virtual声明类的成员函数,把它作为虚函数
2.一个成员函数配声明为虚函数后,在同一类族就不能再定义一个非virtual 且函数首部相同的函数
3.考虑事项:
(1)如果成员函数在类的继承后出现功能的更改一般声明为虚函数
(2)如果通过基类指针或者引用去访问,则应当声明为虚函数
(3)有时会定义空函数体的虚函数,留给派生类添加
*虚析构函数
当基类有非虚析构函数时,只执行基类的析构函数,不执行派生类的析构函数。如果希望能执行派生类的析构函数,可以讲基类的析构函数声明为虚构函数,此时,该基类所有的派生类的析构函数都自动成为虚函数,即使派生类与基类的析构函数名不同。
注:构造函数不能声明为虚函数
三、纯虚函数与抽象类
1.纯虚函数概念
对于基类的虚函数不作任何处理的情况的一种简化形式
virtual 函数类型 函数名(参数表)= 0 ;
注意:纯虚函数没有函数体;最后的=0不表示函数返回值为0,只起形式作用;
2.抽象类
含有纯虚函数的类就是抽象类
只用来派生,不用来生成定义对象
四、结论
1.某基类包含一个或多个纯虚函数,就是抽象类
2.抽象类一般不是现实存在的对象的抽象
3.在类的层次结构中,顶层或最上面几层都可以是抽象类
4.抽象基类是本类族的共用接口,或者说是从同一基类派生出的多个类有同一接口,因此,能响应同一形式的消息。
5.如果基类声明了虚函数,则在派生类中出现首部相同的函数均为虚函数(默认)
6.使用虚函数提高了程序的可扩展性。
给人笔记,仅供参考,欢迎指教!
未经允许,请勿转载!