11.2.4 类内访问
在类内的成员函数中访问该类层次中的虚函数,要使用this指针,见代码11.5所示。
代码11.5 类内成员函数访问虚函数CallVirtualFuncInsideClass
<————————————-文件名:example1105.cpp——————————————> 01 #include<iostream> 02 using namespace std; 03 class base//基类定义 04 { 05 public: 06 virtual void disp()//虚函数disp 07 { 08 cout<<"hello,base"<<endl; 09 } 10 void call_base_1() 11 { 12 this->disp();//直接用disp 13 } 14 void call_base_2() 15 { 16 base:disp(); 17 } 18 }; 19 class child:public base//派生类定义 20 { 21 public: 22 void disp()//对虚函数进行了覆盖定义 23 { 24 cout<<"hello,child"<<endl; 25 } 26 void call_child_1() 27 { 28 disp(); 29 } 30 }; 31 int main() 32 { 33 base obj_Base;//声明一个基类对象 34 child obj_Child;//声明一个派生类对象 35 obj_Base. call_base_1();//基类对象调用非虚函数call_base_1 36 obj_Child. call_child_1();//派生类对象调用非虚函数call_child_1 37 38 base*pBase=&obj_Base;//声明一个基类指针,并用基类对象地址为其初始化 39 pBase->call_base_1();//使用基类指针在成员函数内调用虚函数 40 pBase->call_base_2(); 41 42 pBase=&obj_Child;//用派生类对象地址为基类指针初始化 43 pBase->call_base_1();//使用基类指针在成员函数内调用虚函数 44 pBase->call_base_2(); 45 return 0; 46 }
输出结果如下所示。
hello,base hello,child hello,base hello,base hello,child hello,base
【代码解析】编译器对使用对象名进行的虚函数调用使用静态联编,而且对使用诸如“类名:虚函数”等使用了作用域运算符的调用静态联编,此时,具体调用哪个函数取决于指针的类型。
函数“void call_base_1()”和“void call_child_1()”中对虚函数的调用保持了虚函数的动态联编,关键在于this指针的应用,见代码第12行。