在面向对象编程中,"重载"(overloading)、"重写"(overriding)和"重定义"(redefining)是常用的概念,它们有着不同的含义和用法。
- 重载(Overloading):
指在同一个作用域内,可以定义多个同名函数或操作符,它们具有不同的参数列表或参数类型。
重载函数可以根据传入的参数类型或个数的不同而执行不同的操作。例如,可以定义多个同名函数,分别接受不同数量或类型的参数。
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
- 重写(Overriding):
指子类重新定义(覆盖)了父类中的虚函数,使得子类对象在调用该函数时执行子类中的实现。
重写通常用于实现多态,子类对象可以根据具体的运行时类型来调用相应的函数实现。
class Base {
public:
virtual void print() {
cout << "Base class" << endl;
}
};
class Derived : public Base {
public:
void print() override { // 使用 override 关键字显式标记重写
cout << "Derived class" << endl;
}
};
- 重定义(Redefining):
指在子类中重新定义(覆盖)了父类中的非虚函数,但不使用 override 关键字。
重定义不会触发多态,即使通过父类指针或引用调用函数,也只会执行父类中的实现。
class Base {
public:
void display() {
cout << "Base class" << endl;
}
};
class Derived : public Base {
public:
void display() { // 重新定义了父类的 display 函数
cout << "Derived class" << endl;
}
};
总结来说,重载是指在同一作用域内定义多个同名函数;重写是指子类重新定义父类中的虚函数以实现多态;而重定义是指子类重新定义父类中的非虚函数,但不涉及多态。