重载 重定义 重写

重载 重定义 重写

重载(overload)

重载函数是函数的一种特殊情况。
为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,
但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。
这就是重载函数。
重载函数常用来实现功能类似而所处理的数据类型不同的问题。

// overload
class H
{
public:
    int    add(int    i, int    j);
    double add(double i, double j);
};

int H::add(int i, int j)
{
    return i + j;
}

double H::add(double i, double j)
{
    return i + j;
}

...
    H h;
    cout<<"h.add(2, 3)     : "<<h.add(2, 3)<<endl;
    cout<<"h.add(2.5, 3.0) : "<<h.add(2.5, 3.0)<<endl;
result

重定义(隐藏)

派生类的函数屏蔽了与其同名的基类函数。
注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。
子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。
重定义后子类调用的函数是子类自己的函数,父类的函数会被隐藏。名字隐藏特性。
如果想调用父类的该同名函数,需要用父类加上作用域来指定调用的函数。

class I
{
public:
    int    add(int    i, int    j);
};

int I::add(int i, int j)
{
    int k = i + j;

    cout<<"call I::add(int i, int j). result : "<<k<<endl;

    return k;
}
>
class J : public I
{
public:
    int add(int i, int j);
};
>
int J::add(int i, int j)
{
    int k = i + j;

    cout<<"call J::add(int i, int j). result : "<<k<<endl;

    return k;
}

...
    I i;
    J j;

    i.add(1, 2);
    j.add(1, 2);

    I *pi = &j;
    pi->add(1, 2);
result

重写(override)

派生类中存在重新定义的函数。
其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致
只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。
重写的基类中被重写的函数必须有virtual修饰。

// override
class K
{
public:
    virtual int add(int i, int j);
};

int K::add(int i, int j)
{
    int k = i + j;

    cout<<"call K::add(int i, int j). result : "<<k<<endl;

    return k;
}

class L : public K
{
public:
    int add(int i, int j);
};

int L::add(int i, int j)
{
    int k = i + j;

    cout<<"call L::add(int i, int j). result : "<<k<<endl;

    return k;
}

class M : public K
{
public:
    int add(int i, int j);
};

int M::add(int i, int j)
{
    int k = i + j;

    cout<<"call M::add(int i, int j). result : "<<k<<endl;

    return k;
}

...
    K k;
    K *pk = &k;
    pk->add(1, 2);

    L l;
    pk = &l;
    pk->add(1, 2);

    M m;
    pk = &m;
    pk->add(1, 2);
result

References:

http://www.jb51.net/article/54225.htm
http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html
http://www.oschina.net/question/234345_48772

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容