当前位置: 首页 > ds >正文

【学习笔记】重载和重写的注意事项

【学习笔记】重载和重写的注意事项

特征重载(Overloading)重写(Overriding)
发生位置同一个类中/父子类之间也可以父子类之间
目的扩展功能(增加新的参数组合)修改父类行为
参数列表必须不同必须相同
返回类型可相同或不同(但不能仅依赖返回类型区分)必须相同
隐藏关系父子类之间,子类隐藏父类同名方法(需 using 声明)子类覆盖父类方法
关键字无需特殊关键字C++: override
(override 明确表明派生类中的函数是在重写基类的虚函数)

重载:

class Calculator {
public:// 方法重载:参数类型不同int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; }// 方法重载:参数数量不同int add(int a, int b, int c) { return a + b + c; }
};

重写:

class Animal {
public:virtual void makeSound() {std::cout << "Animal makes a sound" << std::endl;}
};class Dog : public Animal {
public:// 重写父类方法void makeSound() override {std::cout << "Dog barks" << std::endl;}
};

注意点(父子的重载):

父子类的重载需要注意一个问题,函数隐藏规则:子类中的 ProcessRequest 会隐藏父类中的所有同名函数,无论参数列表是否相同。

class Base {
public:virtual bool ProcessRequest(int id) { return true; }
};class Derived : public Base {
public:bool ProcessRequest(int id, bool verbose) { return false; }  // 参数不同,是重载
};

结果呈现:

int main() {Derived d;// 正确:调用 Derived::ProcessRequest(int, bool)d.ProcessRequest(42, true);  // 错误:无法通过 Derived 对象调用 Base::ProcessRequest(int)// d.ProcessRequest(42);  // 编译错误!// 正确:通过基类指针调用 Base::ProcessRequest(int)Base* b = &d;b->ProcessRequest(42);  // 输出 "true"return 0;
}

​ ● 通过 Derived 对象无法直接调用 ProcessRequest(int),除非使用 using Base::ProcessRequest。

​ ● 通过 Base 指针调用 ProcessRequest(int) 时,实际执行的是 Base 类的方法,而非 Derived 的重载版本。

解决方法:使用using引入父类的方法。

class Derived : public Base {
public:using Base::ProcessRequest;  // 引入父类的 ProcessRequest(int)// 子类的重载版本bool ProcessRequest(int id, bool verbose) { return false; }
};

总结:

但是一般重写是在父子类中,重载是在同一个类中。但是需要注意父子重载过程中存在的父类函数隐藏的问题。

http://www.xdnf.cn/news/14112.html

相关文章:

  • Java面试题021:一文深入了解微服务之网关Zuul
  • window 显示驱动开发-DirectX VA 2.0 的扩展支持
  • 《Deep Residual Learning for Image Recognition》(深度残差学习在图像识别中的应用)
  • SpringBoot深度解析:从核心原理到最佳实践
  • 用 HTML、CSS 和 JavaScript 实现五子棋人机对战游戏
  • uniapp-vue3-js-vite-pinia-eslint 快速开发模板
  • 初学时间复杂度
  • LSM树与B+树优缺点分析
  • C primer plus (第六版)第七章 编程练习第9题
  • uniapp中vue3 ,uview-plus使用!
  • 阿里云OSS
  • 使用 Higress AI 网关代理 vLLM 推理服务
  • el-tree-select 多选树形下拉框,实现当选中时,根据当前选择的对象,动态生成表单数据。
  • Go并发编程中的内存同步与竞态:从理论到实践
  • 使用Stone 3D免编码快速创建带AI数字人的数字空间
  • Day30 模块和库的导入
  • 安科瑞 ADW600 多回路电力计量模块:安装、通信与使用指南
  • 流编辑器sed
  • 深入理解 C++ const:九大用法解析 + 八大高频考点
  • android mvI架构梳理
  • M - 中位数
  • Android 实体键盘 设置默认布局
  • 【舞蹈】FineDance
  • 新一代python管理工具--uv
  • Rust 学习笔记1
  • 数字孪生系统汽车工厂生产异常监控的智能利器
  • 快速解决软件测试的逻辑方法运用
  • 数字孪生之KTV洗脚城白皮书:娱乐产业的虚实融合革命
  • LX-YST-1
  • Qt背景平铺