没有名字的c 2022-01-05 15:46 采纳率: 88.2%
浏览 41
已结题

为啥输出3232,能解释一下吗

#include
using namespace std;
class MyClassA{
public:
virtual void f( ){cout<<1; }
void g( ){ cout<<2; }
};
class MyClassB: public MyClassA {
public:
virtual void f( ){ cout<<3; }
void g( ){ cout<<4; }
};
void show( MyClassA &a) { a.f( ); a.g( ); }
void print(MyClassA *p){ p->f(); p->g();}
int main(void)
{
MyClassB b;
show(b);
print(&b);
cout<<endl;
system("pause");
return 0;
}

  • 写回答

1条回答 默认 最新

  • stone_wangzx 2022-01-05 15:56
    关注
    
    void print(MyClassA* p) 
    { 
        p->f();    //通过基类指针调用虚函数f,调用的是p实际指向的子类对象的f函数,所有出3,这个就是多态的实现
        p->g(); //通过基类指针调用函数g,因为g函数时普通函数,因此,调用的是基类的g函数,通过子类指针调用g函数调用的才是子类的g函数
    }
    

    引用和指针是一样的,所以show函数和print函数的调用是一样的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月13日
  • 已采纳回答 1月5日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 Matlab在app上输入带有矩阵形式的初始条件发生错误
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 用ADS设计一款的射频功率放大器