这里讲重载(overload)、覆盖(override)、隐藏是基于OOP的继承、多态来阐述。 三者有一点是完全相同的,那就是讨论的函数都是同名的。
1、重载比较好理解,是指与许存在多个同名函数,而这些函数的参数表不同(或者参数个数不同、或者参数类型不同、或者两者皆不同)。注意:仅仅是函数的返回值不同的重载,编译器是会嗷嗷叫的!
类成员函数被重载的特征:
相同的范围(在同一个类中);
函数名字相同;
参数不同(或者参数个数不同、或者参数类型不同、或者两者皆不同);
virtual 关键字可有可无。
这里要偏离下主题,备案一个刚刚获知的知识点。一直以来,我以为复制构造函数有以下两种重载原型:
Myclass(Myclass &);
Myclass(const Myclass &);
今天又学一手,还有第三种复制构造函数原型:
Myclass(volatile Myclass &);
2、言归正传,而覆盖是指派生类函数覆盖基类函数,它总是和继承、多态扯上千丝万缕的关系,可谓你中有我,我中有你!它的特征如下:
不同的范围(分别位于派生类与基类);
函数名字相同;
参数相同(vs2005里两个函数的返回值也要一样,否则报error);
基类函数必须有virtual 关键字。
也就是说分别处于互为继承关系的类中,两个完全相同的一模一样的虚函数才有覆盖的概念!
看如下代码:
#include <iostream>
using namespace std;
class base{public: void f(int x) { cout<< “base::f(int)” << endl; } void f(float y) { cout << “base::f(float)” << endl;} virtual void g(void) { cout << “base::g(void)” << endl; }};
class derived:public base{public:
//这里的virtual可要可不要,因为基类函数有virtual,继承类同名同参数函数自动加上virtual virtual void g(void) { cout << “derived::g(void)” << endl;}};
int [...]