重载 隐藏 覆盖 的区别 virtual的作用

来源:互联网 发布:企业公告软件哪家好 编辑:程序博客网 时间:2024/05/17 07:02

前段时间有位刚毕业的同事问我,覆盖的作用是啥,隐藏的作用是啥,为什么同时有覆盖和隐藏的概念。

重载:

1,相同的作用于(在同一个类中)

2,函数名相同

3,参数不同

4,virtual关键字可有可无

隐藏:是指派生类覆盖基类的函数

1,不同的作用域(分别位于派生类和基类)

2,函数名相同

3,参数相同

4,基类函数必须有virtual关键字

覆盖:是指派生类的函数屏蔽了与其相同名的基类函数

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

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

virtual的作用:为了实现多态,在调用函数调用时实现动态绑定。


示例:

class Base
{
public:
    Base(){printf("Base构造函数")};
    ~Base(){printf("Base析构函数")};
    void func(){printf("Base成员函数 func()")}; //方式一  隐藏

    void func(int a){printf("Base成员函数 func(int a)")}; //方式二 隐藏

    void virtual func(){printf("Base成员函数 virtual func()")}; //方式三  覆盖
};

class XX :Base
{
public:

    XX(){printf("XX子类构造函数")};

    ~XX(){printf("XX子类析构函数")};

    void func(){printf("XX子类成员函数")};

    
};

class YY :Base
{
public:

    YY(){printf("YY子类构造函数")};

    ~XX(){printf("YY子类析构函数")};

    void func(){printf("YY子类成员函数")};
};

说明:1,当我使用基类指针调用子类对象时,我想调用的是基类的成员函数,那么采用方式一或者方式二。

            2,当我使用基类指针调用子类对象时,我想调用的是子类的成员函数,那么采用方式三。


覆盖的作用是啥


隐藏的作用是啥

1,隐藏和覆盖都实现了子类指针指向子类对象时调用不到基类的成员函数。

2,隐藏实现了,基类指针指向子类对象时调用不到子类的成员函数。

3,覆盖实现了,基类指针指向子类对象时调用 子类成员函数。


原创粉丝点击