c++中的overload(重载)、override(覆盖)和隐藏

来源:互联网 发布:软件开发 成都 编辑:程序博客网 时间:2024/05/16 07:58

    override:是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数。在C++中,经常发生在类的继承中。当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的!!!这个请问一下,是不是这样的??),其子类中对该方法的重新实现就属于override(重写)。

    使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的多态。(函数的多态?C++中实现多态性的手段之一吗?还有多少其他的手段??)
    对于基类中的非virtual类型的成员函数,若其子类中也声明了与该函数名称相同的函数,那么基类中的该函数(也许是一系列函数,如果该函数在基类中有重载的话)将被隐藏,可以通过域解析操作符来调用。不过按照C++的设计思想来说呢,基类中的非virtual类型的成员函数,是不需要在子类中进行修改的,所以如果在子类中出现了这种隐藏的情况,说明应该将基类中的该函数改成virtual类型的,然后就是override了!

    overload:则是指在相同作用域中,多个函数具有相同的名字,但参数的数目和类型各不相同(当然相同数目和类型,如果顺序不同也是可以的),因为函数重载的机制是在C++中函数的签名与其参数有关,而不像C中,只与函数名有关。

    总之,override与overload的一个最大的区别就是作用域不同,以及函数原型是否相同.
   
    overload:重载是指允许存在重名的多个方法。而这些函数的参数列表不同(或者是参数的个数不同、或者是参数的类型不同或者两者都不同)。
    重载(overload 与多态的概念无关),因为是在编译阶段就确定的。只有在与运行阶段确定的才称为面向对象的多态性,即override。

    面向对象的几个基本概念
    多态:目的实现接口重用
    继承:实现代码重用。
    封装:实现代码的模块化.

    override 表示重写,用于继承类对基类中虚成员的实现
    overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现


实例:

#include <iostream.h>#define PI 3.14class Base{public:virtual void f1(float x);void f2(float x);void f3(float x);};class Derived : public Base{public:void f1(float x);void f2(float x);void f3(int x);};void Base::f1(float x){cout << "Base.f1 : " << x << endl;}void Base::f2(float x){cout << "Base.f2 : " << x << endl;}void Base::f3(float x){cout << "Base.f3 : " << x << endl;}void Derived::f1(float x){cout << "Derived.f1 : " << x << endl;}void Derived::f2(float x){cout << "Derived.f2 : " << x << endl;}void Derived::f3(int x){cout << "Derived.f3 : " << x << endl;}void main(){    Derived d;    Base *pb = &d;    // Good : behavior depends solely on type of the object    pb->f1(PI);    d.f1(PI);    // Bad : behavior depends on type of the pointer    pb->f2(PI);    d.f2(PI);    // Bad : behavior depends on type of the pointer    pb->f3(PI);    d.f3(PI);}

结果:

Derived.f1 : 3.14Derived.f1 : 3.14Base.f2 : 3.14Derived.f2 : 3.14Base.f3 : 3.14Derived.f3 : 3请按任意键继续. . .

解释:

1)函数Derived::f1(float)覆盖了Base::f1(float)。
2)函数Derived::f2(float)隐藏了Base::f2(float),而不是重载。
3)函数Derived::f3(int)隐藏了Base::f3(float),而不是覆盖。

原创粉丝点击