c++重载、覆盖和隐藏

c++成员函数的重载、覆盖和隐藏很容易混淆,因此我们必须搞清楚这一点。

1.重载

重载特点:同一访问区域(同类)、函数名称相同、函数参数不同(不关心返回类型)、virtual关键字可有可无

代码示例:

class OverLoad
{
public:
    void test() {}
    void test(int i) {}
    void test(float i) {}
    void test(int i, float j) {}
};

2.覆盖

覆盖是指派生类函数覆盖基类函数,特点是:不同访问区域(不同类)、函数名称相同 、参数相同、基类函数必须有virtual关键字

3.隐藏

隐藏规则:

1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。

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

4.代码示例

#include <iostream>
using namespace std;

class OverLoad
{
public:
    void test() {}
    void test(int i) {}
    void test(float i) {}
    void test(int i, float j) {}
};

class Base
{
public:
    virtual void A(int i) 
    {
        cout << "Base::A()" << endl;
    }

    void B(int i)
    {
        cout << "Base::B()" << endl;
    }

    void C(int i)
    {
        cout << "Base::C()" << endl;
    }

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

class Derive : public Base
{
public:
    //覆盖父类的A  函数名、参数完全相同,且父类要有virtual,子类virtual可有可无
    virtual void A(int i)
    {
        cout << "Derive::A()" << endl;
    }

    //隐藏父类中的B 函数名、参数完全相同,父类无virtual
    void B(int i)
    {
        cout << "Derive::B()" << endl;
    }

    //隐藏父类中的C 函数名相同、参数不同,与virtual无关
    void C(char* str)
    {
        cout << "Derive::C()" << endl;
    }
};

int main()
{
    Derive* d = new Derive;
    Base* b = d;
    //均调用父类中的A
    d->A(1);
    b->A(2);
    //分别调用自己的B
    d->B(1);
    b->B(1);
    //分别调用自己的C
    d->C("1");
    b->C(1);
    d->D();//未被隐藏可以调用D()
    //d->C(1);由于隐藏了父类中的void C(int i),所以不能再调用
}

image
原文链接: https://www.cnblogs.com/zhangbaochong/p/5599222.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/235463

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午4:38
下一篇 2023年2月13日 下午4:39

相关推荐