C++的重载,覆盖,隐藏

这三个概念对于初接触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),而不是覆盖。

posted @ 2012-01-06 21:34  绿色的麦田  阅读(535)  评论(0编辑  收藏  举报