重载、覆盖、隐藏的区别

重载:针对于普通函数

要求函数名相同,形参列表不同,返回值无所谓。

注意不能仅仅通过返回值来区分重载函数。例子:void f(){} 和int f(){}这两个函数定义是错误的,不能同时定义这两个函数!

比如:

void f(int x){}

void f(double x){}

覆盖(重写):针对于继承体系的虚函数

指基类有一个虚函数,派生类中重新定义该虚函数,重新定义的含义是:返回值、函数名、形参列表都一样。

比如:

class Base{
public:   
virtual void f(int x){} }; class Derived:Base{
public:   
void f(int x){} };

 

其中派生类的版本f函数可以加virtrual,不加也可以。但基类一定要加virtual,不然就不是虚函数。

隐藏:针对于继承体系的普通函数

指继承体系中,基类有一个函数f(非虚函数),派生类也有一个f函数(只要是同名的就可以),那么除非显式调用基类版本的f函数,否则是看不到基类版本的f函数的,就好像基类的同名函数都被“隐藏”起来了一样。

比如:

class Base{
public:
    void f(){}
};

class Derived:Base{
public:
    void f(){}
    void f(int x){}
    int f(float x){ Base::f();}

};

上面Derived类中的三个版本的f函数都是对于基类f函数的隐藏。不过虽然隐藏了,还是可以显式用Base::f()来调用Base版本的f函数。或者在派生类中加上using Base::f;这样可以直接使用Base的所有版本的f函数。

 

 

posted @ 2020-03-30 00:51  NeoZy  阅读(222)  评论(0编辑  收藏  举报