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

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

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

重载:

c++ 复制代码
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; }
};

重写:

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 会隐藏父类中的所有同名函数,无论参数列表是否相同。

c++ 复制代码
class Base {
public:
    virtual bool ProcessRequest(int id) { return true; }
};

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

结果呈现:

c++ 复制代码
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引入父类的方法。

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

总结:

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

相关推荐
长葡萄的叶子7 小时前
AI Agent 中的 Skill:从 Tool 调用到任务能力封装
笔记·skill
汉克老师7 小时前
GESP2026年9月认证C++六级( 第三部分编程题(2、分树规划))精讲
c++·gesp·小学生·学c++编程
学生小羊7 小时前
C++ 初阶 学习博客
c语言·c++·c++与c语言的区别·c++基础学习
秦哈哈7 小时前
【HelloAgents】学习笔记(四)
学习·ai·agent
LuminousCPP7 小时前
Linux系统编程(二):从目录树到命令执行|路径、环境变量、alias 与文件操作入门
linux·经验分享·笔记
摇滚侠7 小时前
《Spring Boot 3:高级与架构设计》第 1 章 Bean 与 BeanDefinition 个人理解 2
java·spring boot·笔记·后端
j7~7 小时前
【Linux】三十八.C++ 手写 HTTP 服务器:裸 socket + fork 多进程,从 HTTP 报文解析到浏览器打开网页
linux·网络·网络协议·学习·http·网络编程
日拱一卒的小田7 小时前
ZYNQ学习笔记4-ZYNQ的SD卡控制器2
笔记·学习
江湖人称菠萝包7 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter8-绘图
笔记·qt·qt5
xieliyu.7 小时前
JVM 垃圾回收机制详解:从标记过程、回收算法到垃圾收集器
java·jvm·笔记·java-ee