函数重载和函数重写本质不同:重载在编译期通过参数列表差异实现同一作用域下的静态多态,重写在运行期通过虚函数表实现继承体系中的动态多态。

函数重载和函数重写是C++中两个容易混淆但本质不同的概念。它们都涉及“同名函数”的使用,但应用场景、语法要求和底层机制完全不同。
定义:在同一个作用域内,允许存在多个同名函数,只要它们的参数列表不同(参数个数、类型或顺序不同),就可以构成函数重载。
函数重载发生在编译期,属于静态多态(也叫编译时多态)。
语法示例:
立即学习“C++免费学习笔记(深入)”;
void print(int a) { }
void print(double a) { }
void print(const char* str) { }
关键点:
定义:在继承体系中,派生类提供一个与基类虚函数同名、参数列表相同、返回类型兼容的函数,覆盖基类的实现。这要求基函数为virtual。
函数重写发生在运行期,属于动态多态(也叫运行时多态)。
语法示例:
立即学习“C++免费学习笔记(深入)”;
class Base {
virtual void show() { }
};
class Derived : public Base {
void show() override { } // 重写基类虚函数
};
关键点:
virtual(虚函数)override关键字可显式表明意图,增强安全性1. 发生时机不同:
重载在编译期决定调用哪个函数;重写在运行期根据对象实际类型决定。
2. 作用域不同:
重载在同一个类或同一作用域;重写跨越基类和派生类。
3. 实现机制不同:
重载依赖函数签名差异,编译器生成不同函数名(名字修饰);
重写依赖虚函数表(vtable),通过指针跳转到实际函数。
4. 函数特征要求不同:
重载:参数列表必须不同;
重写:参数列表必须相同,返回类型协变允许特殊情况。
5. 是否需要关键字:
重载不需要额外关键字;
重写建议使用virtual和override以明确语义。
仅返回类型不同 ≠ 重载:
int func();
double func(); // 错误!无法构成重载
非虚函数同名 ≠ 重写:
基类非虚函数被派生类同名函数隐藏,属于“隐藏”而非“重写”,不具多态性。
基本上就这些。理解清楚两者的语法条件和多态机制,就能正确使用C++中的函数同名策略。
以上就是c++++中的函数重载和函数重写有什么区别_重载与重写的语法和本质区别的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号