11.2 虚函数的访问

    对虚函数的访问方式不同,程序具体调用哪个函数可能也会有所不同。为了便于说明,本节统一采用类定义如下所示。


    <————————————文件名:classdef.h————————————————-> #include<iostream> using namespace std; class base//基类定义 { public: virtual void disp()//虚函数 { cout<<"hello,base"<<endl; } }; class child:public base//派生类定义 { public: void disp()//虚函数的覆盖(对普通函数来说是隐藏) { cout<<"hello,child"<<endl; } };

    从上述类定义可以看出,base类和child类中的disp函数都是虚函数(尽管在child类没有用virtual显式修饰disp函数,只要在基类中进行了说明,在所有派生类中,该函数都是虚函数)。

    11.2.1 对象名访问

    同普通函数一样,虚函数一样可以通过对象名来调用,如代码11.2所示。

    代码11.2 使用对象名访问虚函数CallVirtualFuncByName


    <————————————-文件名:example1102.cpp——————————————> 01 #include"classdef.h" 02 int main() 03 { 04 base obj_base;//创建基类对象obj_base 05 child obj_child;//创建派生类对象obj_child 06 obj_base. disp();//通过对象名调用虚函数 07 obj_child. disp();//通过对象名调用虚函数 08 obj_child. base:disp();//通过类名加作用域限定符指明要调用的版本 09 obj_child. child:disp();//通过类名加作用域限定符指明要调用的版本 10 return 0; 11 }

    输出结果如下所示。


    hello,base hello,child hello,base hello,child

    【代码解析】代码第6~7行,通过对象名来访问虚函数,此时编译器采用的是静态联编,在child类中还可以使用作用域运算符来指定使用的是哪个类的函数。使用对象名调用虚函数和前面所讲的使用对象名调用非虚函数没有差别。