Overload,Override和Overwrite

来源:互联网 发布:东方财富有几种软件 编辑:程序博客网 时间:2024/03/29 15:04

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: Book Antiqua;">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!

 

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

 

 

 

3    overwrite (重写)

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

 

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

 

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

 

总结:overload--编译时多态,override--运行时多态,overwrite--子类重写父类的非虚函数

 

 

原创粉丝点击