11.2.2 指针访问

    使用指针访问非虚函数时,编译器根据指针的类型来决定要调用哪个函数,而不是根据指针指向的对象类型,而使用指针访问虚函数时,编译器根据指针所指对象的类型来实现动态联编,具体采用哪个函数与指针的类型无关。使用指针访问是虚函数调用的最主要形式,如示例代码11.3所示。

    代码11.3 使用指针访问虚函数CallVirtualFuncByPointer


    <————————————-文件名:example1103.cpp——————————————> 01 #include"classdef.h" 02 int main() 03 { 04 base obj_base; //创建一个基类对象 05 base*pBase=&obj_base; //使用基类对象地址为基类指针赋值 06 child obj_child; //创建一个派生类对象 07 child*pChild=&obj_child; //使用派生类对象地址为派生类指针赋值 08 pBase->disp(); //使用基类指针调用虚函数 09 pChild->disp(); //使用派生类指针调用虚函数 10 pBase=pChild; //将派生类指针赋值给基类指针 11 pBase->disp(); //使用基类指针调用虚函数 12 pChild=(child*)&obj_base; //使用基类对象地址为派生类指针赋值 13 pChild->disp(); //使用派生类指针调用虚函数,只取决于赋值对象 14 pChild->base:disp(); //使用类名加作用域限定符指明要调用的版本 15 return 0; 16 }

    输出结果如下所示。


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

    【代码解析】指针的类型不是函数调用的决定因素,决定权在于对象属于哪个类,这更符合现实问题的特点。如代码第11行,这时使用基类指针调用虚函数,只会调用子类的虚函数。还要注意的是在派生类中也可以通过“类名:函数名”的形式访问基类中的虚函数,不过使用了作用域运算符后,编译器会将其作静态联编处理。