C++父类指针指向子类对象时成员函数调用结果解析
C++父类指针调用子类成员函数的输出解析
先看给出的C++代码:
#include <iostream> using namespace std ; class A{ public: void m1(){ cout << "A" << endl; } virtual void m2(){ cout << "A" << endl; } void m3(){ cout << "A" << endl; } }; class B: public A{ public: void m1(){ cout << "B" << endl ; } virtual void m2(){ cout << "B" << endl; } virtual void m3(){ cout << "B" << endl; } }; int main(){ A* p = new B() ; p->m1() ; p->m2() ; p->m3() ; }
程序输出为A B A,核心原因是C++的静态绑定和动态绑定机制,逐个分析如下:
p->m1() 输出A
A类的m1是普通成员函数,没有virtual关键字修饰,这类函数采用静态绑定——编译阶段就根据指针的声明类型(A*)确定要调用的函数,完全不考虑指针实际指向的对象类型(B)。所以最终调用的是A类的m1,输出A。p->m2() 输出B
A类的m2被声明为virtual虚函数,子类B重写了这个函数。虚函数采用动态绑定——运行阶段才根据指针实际指向的对象类型(B)来确定调用的函数。所以实际调用的是B类的m2,输出B。p->m3() 输出A
A类的m3是普通成员函数,没有virtual修饰。哪怕子类B把自己的m3声明为virtual,这也只是子类自己的虚函数,并没有重写父类A的m3(重写的前提是父类函数是虚函数)。因此调用时依然是静态绑定,根据指针的声明类型A*调用A类的m3,输出A。
内容的提问来源于stack exchange,提问作者Asia Wojciechowska
相关产品推荐
相关产品推荐

