C++:非虚函数下基类指针与子类指针赋值的深入解析
8 浏览量
更新于2024-08-30
收藏 129KB PDF 举报
在C++编程中,理解基类指针和子类指针的相互赋值是一个关键概念,特别是在面向对象编程中继承和多态的应用。本文档主要关注于非虚函数的情况,通过实例说明如何将子类指针赋值给基类指针,并探讨这种赋值行为对函数调用的影响。
首先,我们定义了一个基础类`animal`,它有一个非虚函数`breathe()`,表示所有动物的基本呼吸行为。然后,我们创建了一个名为`fish`的子类,它继承自`animal`,同样拥有一个`breathe()`函数。这个子类可能具有特定于鱼类的呼吸方法。
在C++中,当一个子类指针被赋值给基类指针时,通常不会发生自动类型转换。这意味着,如果试图将一个`fish`类型的指针赋值给`animal`类型的指针,编译器并不会自动改变指针的实际指向,而是保留子类指针的底层地址。然而,如果该子类没有重写基类的虚函数,那么调用基类指针所指向的对象的函数时,将会执行基类中的函数,而非子类版本。
例如,在`animal.h`文件中,我们有:
```cpp
void fish::breathe() {
cout << "fish breathe" << endl;
}
int main() {
// 创建一个鱼的实例并将其地址赋给一个animal指针
fish myFish;
animal* animalPtr = &myFish; // 子类指针赋值给基类指针
// 当通过animalPtr调用breathe()时,会执行animal类的breathe()函数
animalPtr->breathe(); // 输出 "animal breathe"
return 0;
}
```
在这个例子中,尽管`animalPtr`指向的是`fish`对象,但由于`breathe()`函数在`animal`类中并未声明为虚函数,因此调用`animalPtr->breathe()`时,实际调用的是`animal`类的`breathe()`,而不是`fish`类的版本。
总结来说,C++中基类指针和子类指针的相互赋值涉及到类型安全和多态性。在非虚函数场景下,虽然可以进行赋值操作,但调用的是基类的函数,除非在基类中显式声明函数为虚函数,以便支持动态绑定。这体现了面向对象设计中的静态和动态特性的权衡。理解这些概念对于编写高效、灵活的C++代码至关重要。
2020-08-31 上传
2020-08-26 上传
2021-01-20 上传
点击了解资源详情
点击了解资源详情
2023-06-12 上传
2023-05-27 上传
2023-10-22 上传
2024-09-12 上传
weixin_38679233
- 粉丝: 2
- 资源: 872
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍