📚 重载(Overloading)、覆盖(Overriding)、重定义(Hiding)是面向对象编程中常见的概念,它们分别用于描述不同情况下函数或方法的行为。
目录
重载(Overloading)
覆盖(Overriding)
重定义(Hiding)
总结
重载(Overloading)
重载指的是在同一个作用域内,可以定义多个同名的函数或方法,但它们的参数列表必须不同(包括参数类型、个数或顺序)。编译器会根据调用时提供的参数类型和个数来决定调用哪个具体的函数。
🎃 使用场景:
当需要为同一操作提供多种参数类型支持时,可以使用函数重载。例如,一个打印函数可以接受整数、浮点数、字符串等不同类型的参数。
提供默认参数值也是函数重载的一种形式,这样可以简化函数的调用。
class Example {
public:void print(int num) {// 打印一个整数}void print(double num) {// 打印一个双精度浮点数}
};int main() {Example obj;obj.print(10); // 调用 void print(int num)obj.print(3.14); // 调用 void print(double num)return 0;
}
在Example
类中定义了两个名为 print
的方法,一个接受整数参数,另一个接受双精度浮点数参数。它们之间的区别在于参数的类型。
覆盖(Overriding)
覆盖指的是派生类重写(override)基类的虚函数。只有虚函数才能被派生类覆盖。通过覆盖,派生类可以提供自己特定的实现,而不使用基类的实现。
🎃 使用场景:
当基类定义了一个虚函数,而派生类需要根据自身的逻辑重新实现这个函数时,使用覆盖。
通过基类指针或引用调用虚函数时,实际执行派生类中的版本,实现运行时多态。
class Base {
public:virtual void display() {cout << "Base class display function" << endl;}
};class Derived : public Base {
public:void display() override {cout << "Derived class display function" << endl;}
};
Derived
类覆盖了 Base
类中的 display
函数。当通过基类指针或引用调用 display
函数时,实际执行的是派生类 Derived
中的实现。
重定义(Hiding)
重定义是指在派生类中定义了与基类同名但参数列表不同的函数。在这种情况下,派生类的函数会隐藏基类中的同名函数。这种情况下,基类中的同名函数变得不可见,即使使用基类指针或引用也无法访问到它。
🎃 使用场景:
当派生类需要定义一个与基类同名但参数不同的函数时,这个新函数会隐藏基类中的同名函数。
使用重定义时需要小心,因为基类的同名函数会被派生类的函数遮蔽,可能导致意外的调用行为。
class Base {
public:void display() {cout << "Base class display function" << endl;}
};class Derived : public Base {
public:void display(int num) {cout << "Derived class display function with integer: " << num << endl;}
};
Derived
类定义了一个名为 display
的函数,带有一个整数参数。它重定义了 Base
类中的 display
函数。如果我们尝试通过基类指针或引用调用 display
,编译器将会报错,因为没有与指定参数列表匹配的基类函数。
总结
重载:同一作用域内多个函数名相同但参数列表不同。
覆盖:派生类重写基类的虚函数,提供特定实现。
重定义:派生类中定义了与基类同名但参数列表不同的函数,导致基类函数不可见。