#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;
}
为啥输出3232,能解释一下吗
- 写回答
- 好问题 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函数的调用是一样的
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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设计一款的射频功率放大器