这三个概念对于初接触C++的人员是个老大难问题,曾经一度以为自己已经完全通了,偶一回头,发现居然又搞混了,再复习一次。

1、首先将其重载提取出来,重载针对的是一个类中的函数名相同,参数类型不周的情况(返回值不考虑)

如下代码所示:

class A{

    void (int a);

    void (float a);

    void (int a, int b);

};

2、再谈覆盖,这其实为C++多态性的一种应用,条件最严格:

子类函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致

1)不同的范围(分别位于派生类与基类

2)函数名字相同

3)参数相同

4)返回值类型相同

5)基类函数必须有关键字virtual关键字

注:派生类虚函数覆盖基类虚函数+隐藏基类中所有其他的重载函数

3、最后谈隐藏,隐藏为满足前两点(不同的范围,函数名字相同),而又没能同时满足后三点的情况。

代码示例:

 

class Base

{

 

public:

 

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

 

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

 

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

 

};

 

 

class Derived : public Base

{

 

public:

 

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

 

    void g(int x){ cout << "Derived::g(int) " << x << endl; }

 

    void h(float x){ cout << "Derived::h(float) " << x << endl; }

 

};

 

int main(int argc, char* argv[])

{

 

    Derived  d;

 

    Base *pb = &d;

 

    Derived *pd = &d;

 

 

    // Good : behavior depends solely on type of the object

 

    pb->f(3.14f); // Derived::f(float) 3.14

 

    pd->f(3.14f); // Derived::f(float) 3.14

 

 

    cout<<"****************************************"<<endl;

 

    // Bad : behavior depends on type of the pointer

 

    pb->g(3.14f); // Base::g(float) 3.14

 

    pd->g(3.14f); // Derived::g(int) 3        (surprise!)

 

 

    cout<<"****************************************"<<endl;

    // Bad : behavior depends on type of the pointer

 

    pb->h(3.14f); // Base::h(float) 3.14      (surprise!)

 

    pd->h(3.14f); // Derived::h(float) 3.14

    cout<<"****************************************"<<endl;

}

代码说明:

(1)函数Derived::f(float)覆盖了Base::f(float)。

(2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。

(3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。

1 对 “浅析C++重载,覆盖,隐藏”的想法;

评论被关闭。