第7章虚函数 7.1虚函数 ■72虚析构函数 m7.3抽象类 ■7.4友元、绑定 ■7.5类的存储空间 2
2 第7章 虚函数 7.1 虚函数 7.2 虚析构函数 7.3 抽象类 7.4 友元、绑定 7.5 类的存储空间
71虚函数 虚函数:是一种动态多态函数,通过动态绑定完成 虚函数的调用。(静态多态与静态绑定) 。“单界面,多实现版本”的思想 虚函数到对象的函数成员的映射通过存储在对象中 的一个指针完成。(虚函数入口地址表VFT) 定义: virtual函数原型 【看例71】 3
3 7.1 虚函数 虚函数:是一种动态多态函数,通过动态绑定完成 虚函数的调用。(静态多态与静态绑定) “单界面,多实现版本”的思想 虚函数到对象的函数成员的映射通过存储在对象中 的一个指针完成。(虚函数入口地址表VFT) 定义: virtual 函数原型 【看例7.1】
虚函数使用说明1 1虚函数必须是类的成员函数,非成员函数不能说明 为虚函数 2.虚函数一般是基类的public或protected部分函数,可 在一个或多个public派生类中重新定义(即,可有不 同的实现版本) 函数原型必须完全相同 3.虚函数只有在具有继承关系的类层次结构中定义才 有意义,否则引起额外开销(通过VFT访问) 4.虚函数有隐含的this参数,参数表后可出现const和 volatile 4
4 虚函数使用说明 1 1. 虚函数必须是类的成员函数,非成员函数不能说明 为虚函数 2. 虚函数一般是基类的public 或protected部分函数,可 在一个或多个public派生类中重新定义(即,可有不 同的实现版本) 3. 虚函数只有在具有继承关系的类层次结构中定义才 有意义,否则引起额外开销(通过VFT访问) 4. 虚函数有隐含的this参数,参数表后可出现const 和 volatile 函数原型必须完全相同
使用说明2 5.用虚函数实现程序运行时,必须用指向基类(父类)的 指针(或引用)访问虚函数。根据父类指针指向的对象 类型不同,动态绑定调用相应对象不同版本的虚函 数,实现表现不同行为的操作,这就是“虚函数根据 对象类型表现出的多态性”。【分析例71】 6.一旦在基类中定义为虚函数,则所有后续派生类中 原型相同的no-statici函数将自动成为虚函数,即使没 有“virtual"声明(无限传递性) 【分析例72】 7.虚函数同普通函数成员一样,可以声明为inline函 数,也可以重载、缺省和省略参数。【分析例73】 5
5 5. 用虚函数实现程序运行时,必须用指向基类(父类)的 指针(或引用)访问虚函数。根据父类指针指向的对象 类型不同,动态绑定调用相应对象不同版本的虚函 数,实现表现不同行为的操作,这就是“虚函数根据 对象类型表现出的多态性”。【分析例7.1】 6. 一旦在基类中定义为虚函数,则所有后续派生类中 原型相同的no-static函数将自动成为虚函数,即使没 有“virtual”声明(无限传递性) 【分析例7.2】 7. 虚函数同普通函数成员一样,可以声明为inline 函 数,也可以重载、缺省和省略参数。 【分析例7.3】 使用说明2
使用说明3 8.下列函数成员不能定义为有this参数的虚函 数: 静态函数成员(没有this指针) ·构造函数(构造时对象类型是确定的,不需根据 类型表现出多态性) 9.析构函数可通过基(父)类指针(引用)调用,而 父类指针指向的对象类型是不确定的,因此, 析构函数可定义为虚函数,以便必要时表 现出多态特性。如delete*f调用析构函数。 6
6 8. 下列函数成员不能定义为有this参数的虚函 数: 静态函数成员(没有this 指针) 构造函数(构造时对象类型是确定的,不需根据 类型表现出多态性) 9.析构函数可通过基(父)类指针(引用)调用,而 父类指针指向的对象类型是不确定的,因此, 析构函数可定义为虚函数,以便必要时表 现出多态特性。如delete *f调用析构函数。 使用说明3