
在C++中,函数重载和函数重写是两个容易混淆但用途不同的机制,它们分别服务于编译时多态(静态多态)和运行时多态(动态多态)。理解它们的区别对掌握面向对象编程和多态性至关重要。
函数重载(Function Overloading)
函数重载指的是在同一个作用域内,可以定义多个同名函数,只要它们的参数列表不同(参数个数、类型或顺序不同),编译器会根据调用时传入的实参来决定调用哪一个函数。
注意:返回类型不同不足以构成重载,仅靠返回类型区分的同名函数会导致编译错误。
示例:
立即学习“C++免费学习笔记(深入)”;
void print(int x) { cout << "整数: " << x << endl;}void print(double x) {cout << "浮点数: " << x << endl;}
void print(const string& s) {cout << "字符串: " << s << endl;}
调用 print(5) 会匹配第一个函数,print(3.14) 匹配第二个。这是典型的编译时绑定,也叫静态联编。
关键点:
发生在同一个类或同一作用域中函数名相同,参数列表必须不同与返回类型无关构造函数也可以重载编译器在编译阶段决定调用哪个函数
函数重写(Function Overriding)
函数重写是指在派生类中重新定义基类中的虚函数,要求函数签名(包括返回类型、函数名、参数列表)完全相同,并且基函数必须声明为 virtual。重写的目的是实现运行时多态。
当通过基类指针或引用调用虚函数时,实际执行的是对象所属类型的函数版本,而不是指针类型的函数版本。
示例:
立即学习“C++免费学习笔记(深入)”;
class Animal {public: virtual void speak() { cout << "动物叫" << endl; }};class Dog : public Animal {public:void speak() override { // 明确表示重写cout << "汪汪" << endl;}};
使用场景:
Animal* a = new Dog();a->speak(); // 输出“汪汪”,而非“动物叫”
这体现了动态联编——调用哪个函数在运行时根据对象的实际类型确定。
关键点:
发生在继承关系中,子类重写父类的虚函数函数签名必须完全一致(协变返回类型除外)基函数必须是虚函数(有 virtual)通常使用 override 关键字明确意图调用时机由运行时对象类型决定
重载与重写的主要区别
作用域同一作用域(如同一个类)不同类(基类与派生类)函数名与参数同名,参数不同同名,参数相同是否需要 virtual不需要必须(基类函数)绑定时机编译时(静态)运行时(动态)目的提供多种接口形式实现多态行为
基本上就这些。重载让接口更灵活,重写让行为可扩展。理解清楚它们的使用场景和规则,能写出更清晰、可维护的C++代码。
以上就是c++++中什么是函数重载和函数重写_c++重载与重写机制讲解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1478369.html
微信扫一扫
支付宝扫一扫