overload ,override 和 overwrite

来源:互联网 发布:守望先锋点赞 知乎 编辑:程序博客网 时间:2024/04/24 20:58

昨天查资料时碰到 overwrite ,面熟,想起 C++ 中的 overload 和 override 。以前学 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 中会报以下错误: -family: BookAntiqua;">error C2556: 'void __cdecl Func(int)' : overloaded functiondiffers 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();     // 利用 C++ 多态   CBaseClass *pClass = new CSubClass;   // 这里调用的是 CSubClass::whoami()   pClass->whoami();   delete pClass;   return 0;} 
上面代码的输出:this is CBaseClass! 

                        this is CSubClass!

override 是 C++ 多态实现的关键一环。

3    overwirte (重定义)

翻了翻各种 C++ 著作,没发现对 overwrite 的描述。也就是说,在 C++ 中,没有 overwrite 这一说法(可能是我翻的不全,知道的朋友望不吝赐教)。倒是有人在解析 java 中的 overwrite ,这里一并提一下。 在相关描述中,称overwrite 是指在类的继承结构中,子类对父类方法的重写,完全覆盖掉父类的方法,也就是说是对非 virtual 成员方法的重写重定义。

overwrite可以是对基类的数据成员的重定义也可以是对基类成员函数的重定义,重写之后父类的同名数据成员和成员函数自动隐藏,如果对象需要访问必须添加父类的作用域实现。

在实际的操作当中,还可分为两种类型的实现

  • 与基类成员函数参数完全相同的重写实现
  • 与基类成员函数的函数名相同,但是实现参数不同的实现

0 0
原创粉丝点击