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

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

重载:

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,覆盖实现了,基类指针指向子类对象时调用 子类成员函数。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值