■重载:同一作用域中,使用相同函数名,但是函数的参数个数或类型不同的函数。
例如:
#include <iostream>
using namespace std;
class printer{
public :
void print(int data){};
void print(float data){};
void print(const char& pStr, size_t size){};
//other code
};
class stringPrinter:public printer{
public :
/* using printer::print; */ //将基类中的print 函数声明引入到派生类的作用域中
// 派生类的作用域中没有print(int)的函数定义(被派生类中的print(const string&)隐藏)
void print(const string& str){};
//other code
};
int main(){
stringPrinter myPrinter;
myPrinter.print(2011);
return 0;
}
■重写:在派生类中对基类中的虚函数重新实现,即派生类对基类虚函数的个性化定制。
Note:
1)函数的重写与访问层级(public、private、protected)无关(但是一般情况下,派生类重写函数应和基类对应函数具有相同的访问层级)
例如:
class CWorker{
public:
virtual void Working(){ ... }
};
------------------------------------
class CDriver : public CWorker{
private :
virtual void Working(){ ... ... }
};
2)const 可能会是虚成员函数的重写失效(常量属性是函数签名中的一部分)例如:
class CDriver : public CWorker{
private :
virtual void Working() const{ ... } //不会重写基类的Working()函数
};
3)重写函数必须和原函数具有相同的返回类型(函数的返回类型不是函数签名的一部分,要求返回类型必须相同)
例如:
class CDriver : public CWorker{
private :
virtual bool Working() const{ ... } //错误:重写虚函数返回类型有差异
};
■隐藏:派生类中的函数屏蔽基类中具有相同名字的非虚函数(调用类的成员函数时,编译器会沿着类的继承链逐级向上查找函数的定义,如果找到就停止,即编译器的函数查找也就到达不了基类中,实现了隐藏)