编写高质量代码——界别Overloading、Overriding及Hiding之间的差异

编写高质量代码——区分Overloading、Overriding及Hiding之间的差异

■重载:同一作用域中,使用相同函数名,但是函数的参数个数或类型不同的函数。

例如:

#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 boolWorking() const{ ... }  //错误:重写虚函数返回类型有差异

};

■隐藏:派生类中的函数屏蔽基类中具有相同名字非虚函数(调用类的成员函数时,编译器会沿着类的继承链逐级向上查找函数的定义,如果找到就停止,即编译器的函数查找也就到达不了基类中,实现了隐藏)