c++重载、隐藏和覆盖

重载

  • 函数名字相同,但参数列表或者返回值不同
  • 一组函数要重载必须处在同一作用域
class Base
{
public:
    Base(int data=0):m_a(data){}
    void show(){cout<<"Base::show()"<<endl;}
    void show(int){cout<<"Base:show(int)"<<endl;}
private:
    int m_a;
};

如上,Base类中的show()成员函数和show(int)成员函数的名字相同,但是参数不同,并且他们都在同一作用域(Base类这个作用域)下,因此这组成员函数属于重载关系

调用时,编译器可根据传入参数的数量和类型自行选择调用,测试如下

void test(){
    Base b;
    b.show();
    b.show(1);
}

隐藏

  • 隐藏是指作用域的隐藏
  • 继承结构中,派生类的成员函数与基类的成员函数同名
  • 则派生类的成员函数会隐藏掉基类的成员函数调用
class Derive:public Base
{
public:
    Derive(int data=0):Base(data),m_b(data){};
    void show(){cout<<"Deive::show()"<<endl;}
private:
    int m_b;
};

以上代码中,Derive类继承Base类,且Derive类中有一个和Base类同名的成员函数show。接下来我们来看测试代码的运行结果

void test(){
    // Base b;
    // b.show();
    // b.show(1);
    Derive d;
    d.show();
}

从运行结果可以看到,子类对象在调用与基类同名的成员函数(show())函数时,运行结果显示调用的是子类的show(),而不是基类的show()

这是因为,子类的show成员函数与基类的show成员函数重名了,因此子类隐藏掉了基类的同名成员。

因此,从关系上看

  • Base::show()与Base::show(int)属于重载关系
  • Base::show()、Base::show(int)和Derive::show()属于隐藏关系

在这种情况下,想调用基类的同门函数,加上作用域即可

    d.Base::show();

重写(覆盖)

基类和派生类的方法,返回值、函数名以及参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理为虚函数,他们之间成为覆盖关系

详见

c++虚函数、静态绑定与动态绑定-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_58158950/article/details/136016053?spm=1001.2014.3001.5502

重写只能应用于虚函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值