overload,override和overwrite

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方法的重写。

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值