成员函数的重载、覆盖、隐藏

1.成员函数被重载的特征:

    ①相同的范围(在同一个类中)

    ②函数名字相同

    ③参数不同

    ④virtual关键字可有可无。

class A
{
public:
    void fun()
    {
        cout<<"fun()"<<endl;
    }
    void fun(int)
    {
        cout<<"fun(int)"<<endl;
    }
};

2.覆盖指派生类函数覆盖基类函数,特征:

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

    ②函数名字相同

    ③参数相同

    ④基类函数必须有virtual关键字

class A
{
public:
    virtual void fun()
    {
        cout<<"A:fun()"<<endl;
    }
};
class B:public A
{
public:
    void fun()
    {
        cout<<"B:fun()"<<endl;
    }
};

3.隐藏指派生类屏蔽了与其同名的基类函数

规则①:如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(与重载区别)

class A
{
public:
     virtual void fun(int a)
    {
        cout << "A:fun()" << endl;
    }
};
class B :public A
{
public:
    virtual void fun(char c)
    {
        cout << "B:fun()" << endl;
    }
};
void main()
{
    B b;
    b.fun(10);  //调用派生类的成员函数
}

规则②:如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(与隐藏区别)

class A
{
public:
    void fun(int a)
    {
        cout << "A:fun()" << endl;
    }
};
class B :public A
{
public:
    void fun(int c)
    {
        cout << "B:fun()" << endl;
    }
};
void main()
{
    B b;
    b.fun(10);  //调用派生类的成员函数
}

隐藏的作用:在多继承的情况下,隐藏可以很好地规避当在多个基类中定义了同名的方法,实例调用方法时引起的多义性。

posted @ 2019-07-11 18:33  Single_Dont  阅读(268)  评论(0编辑  收藏  举报