重载、重写、覆盖、隐藏

张开发
2026/5/4 11:11:28 15 分钟阅读
重载、重写、覆盖、隐藏
这四个概念重载、重写、覆盖、隐藏是C面向对象中最容易混淆的点。我用最清晰的定义可运行代码对比表格一次性讲透。一、核心定义速览1. 重载 (Overload)同一作用域同名函数参数不同个数/类型/顺序。2. 重写 (Override)子类重写父类虚函数函数签名完全相同返回值/参数/const。3. 覆盖 (Override)和重写是同一个东西只是叫法不同多态调用时子类覆盖父类逻辑。4. 隐藏 (Hide)子类有同名函数不管参数是否相同父类同名函数被隐藏非虚函数必隐藏虚函数参数不同也隐藏。二、代码实战详解1. 重载 (Overload) —— 同一类里的“分身术”规则必须在同一个类同一作用域。函数名相同参数列表必须不同。返回值不同不算重载。classCalculator{public:// 重载1int intintadd(inta,intb){returnab;}// 重载2double double 参数类型不同doubleadd(doublea,doubleb){returnab;}// 重载3三个int相加 参数个数不同intadd(inta,intb,intc){returnabc;}};2. 重写 / 覆盖 (Override) —— 子类的“换芯术”多态规则父类函数必须是virtual。子类函数签名必须完全一致函数名、参数、const都要一样。作用实现多态指针/引用调用时运行时决定调用子类还是父类。classAnimal{public:// 父类虚函数virtualvoidspeak(){cout动物叫endl;}};classDog:publicAnimal{public:// 重写覆盖必须加virtualC11推荐加override关键字检查voidspeak()override{cout汪汪汪endl;}};// 测试多态覆盖效果Animal*anewDog();a-speak();// 输出汪汪汪子类覆盖了父类逻辑3. 隐藏 (Hide) —— 子类的“屏蔽术”非多态规则只要子类有同名函数父类的同名函数就会被隐藏。哪怕参数不同父类函数也用不了必须加 Base:: 才能调用。这是最容易踩坑的地方classBase{public:voidshow(intx){coutBase: xendl;}};classDerived:publicBase{public:// 子类有同名函数show参数是doublevoidshow(doublex){coutDerived: xendl;}};// 测试隐藏Derived d;d.show(10);// 错误子类show(double)隐藏了父类show(int)10无法转double不是编译器找不到父类版本d.Base::show(10);// 正确强制调用父类被隐藏的函数d.show(3.14);// 正确调用子类自己的三、终极对比表面试必背特性重载 (Overload)重写/覆盖 (Override)隐藏 (Hide)位置同一个类父类 - 子类父类 - 子类函数名相同相同相同参数必须不同必须相同可同可不同virtual不需要父类必须有不需要调用方式编译期确定运行期多态编译期确定子类屏蔽父类本质静态多态动态多态名字查找优先级四、一句话总结重载亲兄弟长得像同名活儿不同参数不同。重写儿子改爹的活虚函数一模一样爹的指针调用干儿子的活。隐藏儿子占了爹的名字不管参数爹的活被藏起来了。

更多文章