c++重载、隐藏和覆盖

重载

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

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

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

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

c++重载、隐藏和覆盖_第1张图片

隐藏

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

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

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

c++重载、隐藏和覆盖_第2张图片

从运行结果可以看到,子类对象在调用与基类同名的成员函数(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

重写只能应用于虚函数

你可能感兴趣的:(c++,c++,开发语言)