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

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

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

特征重载(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; }
};

总结:

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

相关文章:

  • 前端历练(一)Tailwind 配置
  • MCP(Model Context Protocol,模型上下文协议)的当前状态
  • 《棒垒球百科》棒球、垒球奥运会运动员规定·棒球1号位
  • kafka Tool (Offset Explorer)使用SASL Plaintext进行身份验证
  • Reels流量密码:Ins 2025算法偏好的7个隐形规则
  • 自动化模型管理:MediaPipe Android SDK 中的模型文件下载与加载机制
  • 中小企业数字化转型:如何选择靠谱的软件开发服务商?
  • 详解Python当中的pip常用命令
  • Day13_C语言基础项目实战
  • Python训练营-Day30-模块和库的导入
  • PHP设计模式实战:微服务架构与事件驱动系统
  • android过渡动画
  • iOS性能调试完整流程实录:工具组合下的问题定位与修复实践(含keymob)
  • PyTorch深度学习框架60天进阶学习计划 - 第58天端到端对话系统(一):打造你的专属AI语音助手
  • 嵌入式PADS原理图与元件符号绘制实现
  • 如何安装使用qmt脚本跟单聚宽策略
  • Vue嵌套路由
  • Ubuntu Server 24.04|22.04|20.04|18.04 安装GUI DESKTOP xfce4
  • Java详解LeetCode 热题 100(32):LeetCode 138. 随机链表的复制
  • WPF数据绑定疑惑解答--(关于控件的Itemsource,Collection绑定)
  • 西安网站制作顶尖公司/培训机构退费纠纷一般怎么解决
  • 什么网站发布找做效果图的/整站排名
  • 开发软件开发/刷关键词排名seo软件
  • 阿里云服务器是干什么用的/seo哪家强
  • 建网站金坛哪家强?/网络营销推广方案有哪些
  • 网站建设投标书怎么制作/企业网站的优化建议