C++笔记(九)——类4:成员函数的重载、覆盖、隐藏

C++ 类层次中的同名函数,有三种关系:

  • 重载(overload)
  • 重写、覆盖(override)
  • 隐藏(hide,oversee)

一、重载

c++函数重载

  1. 相同的范围(在同一个类中)
  2. 相同的函数名字
  3. 不同的参数列表,与返回值类型没有关系
  4. virutal关键字可有可无

作用:用来实现功能类似而所处理的数据类型不同的问题。方便了程序员可以根据不同的参数个数,顺序,类型,自动匹配方法,减少写多个函数名或方法名的重复步骤。

二、重写、覆盖

覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名相同
(3)参数列表相同
(4)被覆盖基类函数必须有virtual 关键字,即是虚函数
(5)与基类的虚函数有相同的返回类型: 或者与基类虚函数的相同,或者都返回指针(或引用),并且派生类虚函数所返回的指针(或引用)类型是基类中被替换的虚函数所返回的指针(或引用)类型的子类型(派生类型)。
        下例中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖。

#include <iostream>

using namespace std;

class Base
{
public:
    void f(int x)
    { 
        cout << "Base::f(int) " << x << endl; 
    }

    void f(float x)
    { 
        cout << "Base::f(float) " << x << endl; 
    }

    virtual void g(void)
    { 
    cout << "Base::g(void)" << endl;
    }
};

class Derived : public Base //Derived继承Base
{
public:
    void g(void) //该函数覆盖了Base类里的virtual void g(void)函数
    { 
        cout << "Derived::g(void)" << endl;
    }
};

void main(void)
{
    Derived d;
    Base *pb = &d;
    pb->f(42); // Base::f(int) 42

    pb->f(3.14f); // Base::f(float) 3.14
    pb->g(); //覆盖,多态,打印Derived::g(void)

    getchar();
}

三、隐藏

隐藏指在某些情况下,派生类中的函数屏蔽基类中的同名函数,这些情况包括

  • 两个函数参数相同,但是基类不是虚函数。和覆盖的区别在于基类函数是否是虚函数,例如

        (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。函数A::fun(int x)隐藏了B::fun(int *x),而不是重载。


        (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。若基函数是虚函数,那它是覆盖。如下:函数Derived::foo(int x)隐藏了Base::foo(int x),而不是覆盖。

转自:https://blog.csdn.net/qq_26437925/article/details/54933326

猜你喜欢

转载自blog.csdn.net/qq_37764129/article/details/83008569