1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调 用时的实参表与形参表来选择方法体的。
“overload”
翻译过来就是:
超载,
过载,
重载,
超出标准负荷;
“override”
翻译过来是:
重置,
覆盖
,
使原来的失去效果。
先来说说重载的含义,在日常生活中我们经常要清洗一些东西,比如洗车、
洗衣服。尽管我
们说话的时候并没有明确地说用洗车的方式来洗车,
或者用洗衣服的方式来洗一件衣服,
但
是谁也不会用洗衣服的方式来洗一辆车,
否则等洗完时车早就散架了。
我们并不要那么明确
地指出来就心知肚明,
这就有重载的意思了。
在同一可访问区内被声名的几个具有不同参数
列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用
哪个函数,这种机制叫重载,重载不关心函数的返回值类型。这里,
“
重载
”
的
“
重
”
的意思不
同于
“
轻重
”
的
“
重
”
,它是
“
重复
”
、
“
重叠
”
的意思。例如在同一可访问区内有:
①
double calculate(double);
②
double calculate(double
,
double);
③
double calculate(double, int);
④
double calculate(int, double);
⑤
double calculate(int);
⑥
float calculate(float);
⑦
float calculate(double);
六个同名函数
calculate
,①②③④⑤⑥中任两个均构成重载,⑥和⑦也能构成重载,而①
和⑦却不能构成重载,因为①和⑦的参数相同。
覆盖是指派生类中存在重新定义的函数,
其函数名、
参数列、
返回值类型必须同父类中的相
对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,
当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,
而不是父类中的被覆
盖函数版本,这种机制就叫做覆盖。
下面我们从成员函数的角度来讲述重载和覆盖的区别。
成员函数被重载的特征有:
1)
相同的范围(在同一个类中)
;
2)
函数名字相同;
3)
参数不同;
4) virtual
关键字可有可无。
覆盖的特征有:
1)
不同的范围(分别位于派生类与基类)
;
2)
函数名字相同;
3)
参数相同;
4)
基类函数必须有
virtual
关键字。
比如,在下面的程序中:
#include <iostream.h>
class Base
{
public:
void f(int x){ cout << "Base::f(int) " << x << endl; }
void f(float x){ cout << "Base::f(float) " << x << endl; }
virtual void g(void){ cout << "Base::g(void)" << endl;}
};
class Derived : public Base
{
public:
virtual void g(void){ cout << "Derived::g(void)" << endl;}
};
void main(void)
{
Derived d;
重载是方法名称相同,参数或类型不同,针对同一个类吧,
覆盖是子类覆盖父类方法。