跳到主要内容

简述类成员函数的重写、重载和隐藏的区别 ?

参考答案:

在C++中,类的成员函数可以重写(Override)、重载(Overload)或隐藏(Hide)。这些概念在面向对象编程中非常重要,但是它们各自的含义和应用场景是有所不同的。

  1. 重写(Override)

    • 重写是面向对象编程中的一个重要概念,特别是在继承中。
    • 当子类有一个和父类同名且参数列表也相同的函数时,我们说子类重写了父类的这个函数。
    • 在运行时,如果子类对象调用了这个函数,那么会执行子类中的版本,而不是父类中的版本。
    • 重写要求子类函数的访问修饰符不能比父类中被重写的函数更严格(例如,如果父类中的函数是public的,那么子类中的重写函数也必须是public的)。
    • 重写还要求在运行时能够确定应该调用哪个版本的函数,这通常是通过动态绑定(也称为后期绑定)来实现的。
  2. 重载(Overload)

    • 重载是指在同一个类中定义多个同名但参数列表不同的函数。
    • 重载的函数可以有不同的返回类型,但是参数列表必须不同(可以是参数的数量不同,也可以是参数的类型不同)。
    • 在编译时,根据传递给函数的参数来确定应该调用哪个版本的函数。
    • 重载与函数的返回值无关,只与函数的名称和参数列表有关。
  3. 隐藏(Hide)

    • 隐藏是当派生类有一个与基类同名的成员(无论是数据成员还是成员函数)时发生的现象。
    • 如果派生类中的成员与基类中的成员同名,并且派生类对象调用这个成员时,会调用派生类中的成员,而不是基类中的成员。这就是隐藏。
    • 隐藏并不要求函数签名(即函数名和参数列表)必须相同。即使函数签名不同,派生类中的成员也可以隐藏基类中的成员。
    • 与重写不同,隐藏不涉及动态绑定。在编译时就可以确定应该调用哪个版本的成员。

总结:重写、重载和隐藏都是在C++中处理同名函数或成员的方法,但它们的规则和应用场景是不同的。重写主要用于实现多态性,重载主要用于提供函数的多种使用方式,而隐藏则可能导致一些不易察觉的错误,因此在编程时需要特别注意。