在 C++ 语言中,函数重载(Function Overloading)和函数重写(Function Overriding)是面向对象编程的重要特性。它们分别适用于类的成员函数。以下是函数重载和函数重写的区别:
函数重载(Function Overloading)
- 定义:函数重载是指在同一个作用域内,可以有多个函数具有相同的名称,但是它们的参数列表不同(参数个数或参数类型不同)。
- 影响因素:函数重载仅和函数的参数列表有关,与返回值类型无关。
- 实现:编译器根据函数的参数列表来决定调用哪个具体的函数。在调用函数时,编译器会根据传入的参数类型和数量选择最匹配的重载函数。
- 示例:
int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; }
函数重写(Function Overriding)
- 定义:函数重写是指在派生类中重新定义(覆盖)基类中已有的成员函数,使得派生类对象在调用该函数时执行派生类中的版本而不是基类中的版本。
- 影响因素:函数重写涉及基类和派生类之间的继承关系,需要有虚函数来实现多态。
- 实现:在基类中将需要重写的函数声明为虚函数(使用
virtual
关键字),然后在派生类中重新定义该函数,方法签名(函数名和参数列表)必须与基类中的虚函数完全匹配。
- 示例:
class Shape { public: virtual void draw() { cout << "Drawing a shape." << endl; } }; class Circle : public Shape { public: void draw() override { cout << "Drawing a circle." << endl; } };
动态绑定:函数重写利用动态绑定实现多态。当通过基类指针或引用调用虚函数时,将在运行时动态地选择执行哪个函数版本。这使得在运行时可以根据对象的实际类型调用适当的函数,实现了多态性。