C++-----重载、重写与隐藏

之前在学习C++继承和多态的时候对于三个概念理解的不是很透彻,现在对这三个的概念来总结一下


重载 overload

重载:简单说就是函数名称相同,但是参数列表不相同的情形,这样的同名不同参数的函数互相称之为重载函数。
重载实际上属于多态的一种,是编译时多态即静态多态
来看看重载的条件

  • 相同的范围(成员函数重载)
  • 函数名相同
  • 参数列表不同

在这里解释一下参数列表不同可以是以下几种不同

  • 参数个数不同
  • 参数类型不同
  • 参数顺序不同

来看示例(都在类中实现)
这里写图片描述
我们可以看到,前四个互为重载函数,而最后一个不是。 不能只用返回值类型不同来重载函数


重写 override

重写也就是我们说的覆盖,覆盖是指派生类中的函数覆盖基类的函数
派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),那么派生类中的那个函数就相当于重写了基类的该函数。注:基类中被重写的函数必须有virtual关键字修饰
来看例子:

class Base
{
public:
    virtual void fun(int i)
    {
        cout << "Base::fun" << i << endl;
    }
};
class Derive :public Base
{
public:
    virtual void fun(int i)
    {
        cout << "Derive::fun" << i << endl;
    }
};
int main()
{
    Base b;
    Derive d;
    Base* pb = &b;
    pb->fun(3);

    pb = &d;
    pb->fun(5);
    system("pause");
    return 0;
}

这里写图片描述
派生类调用时会调用派生类的重写函数,不会调用被重写函数。
上面是利用虚函数实现多态的代码,不理解的可以戳链接(https://blog.csdn.net/qq_34021920/article/details/78307591


隐藏

隐藏是指派生类的函数屏蔽了与其同名的基类函数。注:只要是同名函数,不管参数列表是否相同,基类函数都会被隐藏,有下面两种情况:

  • 派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏
  • 派生类函数名,参数列表,返回值类型与基类的完全一样,此时基类中被隐藏的函数不能有virtual修饰
class Base
{
public:
    void fun(int i)
    {
        cout << "Base::fun" << i << endl;
    }
};
class Derive :public Base
{
public:
    void fun(int i, int j)
    {
        cout << "Derive::fun" << i << j <<endl;
    }
};
int main()
{
    Derive d;
    d.fun(3);//出错
    d.fun(5, 4);
    system("pause");
    return 0;
}

我们可以看出d.fun(3);本来是想调用基类的函数,但是基类的函数已经被隐藏,导致编程出错


重载和重写的区别

  • 范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中
  • 参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同
  • virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有

隐藏与重写还有重载的区别

  • 隐藏与重载的范围不同:重载和被重载的函数在同一个类中二隐藏与被隐藏函数在不同类中
  • 参数列表不同:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,当参数相同时,若基类中的函数被virtual修饰,那就是被重写了。

猜你喜欢

转载自blog.csdn.net/qq_34021920/article/details/80177931