overload,override和overwrite

来源:互联网 发布:css和JavaScript 编辑:程序博客网 时间:2024/05/10 14:45

overloadoverrideoverwrite

 

昨天查资料时碰到overwrite,面熟,想起C++中的overloadoverride。以前学C++的时候,曾认真区分过他们,被overwrite一搅和,又有点模糊了,不得不查阅资料再次区分一下。

1          overload(重载)

同一作用域内,函数名相同,参数列表不同的多个函数,构成重载。

 

仅返回值类型不同,不足以构成重载函数,比如:

int Func(int iIndex); // ——

int Func(std::string strIndex); // ——

void Func(int iIndex); // ——

①和②形成重载,③则是非法函数。因为编译器在编译时,会将函数名结合参数列表做一定的转换,比如上述函数在编译器中对应的函数名可能为:

_Func_int // ——

_Func_string // ——

_Func_int // ——

注:这里的函数名转换仅是形象化表述,实际情况视不同的编译器而不同,比如在g++中,①可能会被转换为_Funcii,总之,编译器区分不同的函数,依赖两个元素:函数名和参数列表。

 

显然,编译器无法区分①和③,认为③是对①的重复定义错误。在VC中会报以下错误:

error C2556: 'void __cdecl Func(int)' : overloaded function differs only by return type from 'int __cdecl Func(int)

2          override(覆写)

override是指在类继承结构中,子类对父类的virtual方法进行重新定义。举例:

#include<iostream>

 

using namespace std;

 

class CBaseClass

{

public:

    // 父类虚函数

    virtual int whoami()

    {

        cout << "this is CBaseClass!" << endl;

        return 0;

    }

};

 

class CSubClass : public CBaseClass

{

public:

    // 对基类whoami函数的override

    virtual int whoami()

    {

        cout << "this is CSubClass!" << endl;

        return 0;

    }

};

 

int main(int argc, char **argv)

{

    CBaseClass objBase;

 

    // 对基类whoami函数的调用

    objBase.whoami();

 

    CBaseClass *pClass = new CSubClass;

    // 利用C++多态,这里调用的是CSubClass::whoami()

    pClass->whoami();

 

    delete pClass;

   

    return 0;

}

 

上面代码的输出:

this is CBaseClass!

this is CSubClass!

 

overrideC++多态实现的关键一环。

 

3          overwirte(重写)

翻了翻各种C++著作,没发现对overwrite的描述。也就是说,在C++中,没有overwrite这一说法(可能是我翻的不全,知道的朋友望不吝赐教)。

倒有人在解析java中的overwrite,这里一并提一下。

 

在相关描述中,称overwrite是指在类继承结构中,子类对父类方法的重写,完全覆盖掉父类的方法,也就是说是对非virtual方法的重写。

 

后面找到权威说法后,再更新此文。