You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:12:40