overload,override和overwrite
昨天查资料时碰到overwrite,面熟,想起C++中的overload和override。以前学C++的时候,曾认真区分过他们,被overwrite一搅和,又有点模糊了,不得不查阅资料再次区分一下。
同一作用域内,函数名相同,参数列表不同的多个函数,构成重载。
仅返回值类型不同,不足以构成重载函数,比如:
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)
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!
override是C++多态实现的关键一环。
翻了翻各种C++著作,没发现对overwrite的描述。也就是说,在C++中,没有overwrite这一说法(可能是我翻的不全,知道的朋友望不吝赐教)。
倒有人在解析java中的overwrite,这里一并提一下。
在相关描述中,称overwrite是指在类继承结构中,子类对父类方法的重写,完全覆盖掉父类的方法,也就是说是对非virtual方法的重写。
后面找到权威说法后,再更新此文。