函数重载允许同一作用域内同名函数通过参数列表不同实现静态多态,而函数重写通过基类指针调用虚函数实现动态多态。

在C++中,函数重载和函数重写是两个容易混淆但用途不同的机制,它们分别服务于编译时多态(静态多态)和运行时多态(动态多态)。理解它们的区别对掌握面向对象编程和多态性至关重要。
函数重载指的是在同一个作用域内,可以定义多个同名函数,只要它们的参数列表不同(参数个数、类型或顺序不同),编译器会根据调用时传入的实参来决定调用哪一个函数。
注意:返回类型不同不足以构成重载,仅靠返回类型区分的同名函数会导致编译错误。
示例:
立即学习“C++免费学习笔记(深入)”;
void print(int x) {
cout << "整数: " << x << endl;
}
<p>void print(double x) {
cout << "浮点数: " << x << endl;
}</p><p>void print(const string& s) {
cout << "字符串: " << s << endl;
}</p>调用 print(5) 会匹配第一个函数,print(3.14) 匹配第二个。这是典型的编译时绑定,也叫静态联编。
关键点:
函数重写是指在派生类中重新定义基类中的虚函数,要求函数签名(包括返回类型、函数名、参数列表)完全相同,并且基函数必须声明为 virtual。重写的目的是实现运行时多态。
当通过基类指针或引用调用虚函数时,实际执行的是对象所属类型的函数版本,而不是指针类型的函数版本。
示例:
立即学习“C++免费学习笔记(深入)”;
class Animal {
public:
virtual void speak() {
cout << "动物叫" << endl;
}
};
<p>class Dog : public Animal {
public:
void speak() override { // 明确表示重写
cout << "汪汪" << endl;
}
};</p>使用场景:
Animal* a = new Dog(); a->speak(); // 输出“汪汪”,而非“动物叫”
这体现了动态联编——调用哪个函数在运行时根据对象的实际类型确定。
关键点:
| 特性 | 函数重载 | 函数重写 |
|---|---|---|
| 作用域 | 同一作用域(如同一个类) | 不同类(基类与派生类) |
| 函数名与参数 | 同名,参数不同 | 同名,参数相同 |
| 是否需要 virtual | 不需要 | 必须(基类函数) |
| 绑定时机 | 编译时(静态) | 运行时(动态) |
| 目的 | 提供多种接口形式 | 实现多态行为 |
基本上就这些。重载让接口更灵活,重写让行为可扩展。理解清楚它们的使用场景和规则,能写出更清晰、可维护的C++代码。
以上就是c++++中什么是函数重载和函数重写_c++重载与重写机制讲解的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号