C++函数重载、重定义、重写

转载自:http://blog.csdn.net/m631521383/article/details/9813987?userName=u013917410&userInfo=Exepgha6JjkQGLgs6P%2FWIKafd%2BIfAtzDVT8CLsjK2SWnwCIt6%2BzXNEAtXyDflsuK


1.重载:要求函数名相同,参数列表不同,重载只是在类的内部存在。与返回类型无关,故不能靠返回类型来判断重载;

2.重定义(隐藏):要求函数名相同,函数类型为非虚函数,与返回类型、函数参数列表无关。重定义是发生在继承子类与父类之间。

当子类的函数名和参数列表和父类相同时,这是要看父类函数是否是virtual虚函数,如果是则是重写,如果不是则是重定义;

3.重写(覆盖):要求函数名相同,参数列表相同,函数类型为virtual虚函数,返回类型相同,重写是发生在继承子类与父类之间。注意:被重写的函数不能使static,必须是virtual)。


eg:

#include <iostream>
using namespace std;
class Base
{
private:
    virtual void  display()
    {
        cout<<"Base display()"<<endl;
    }
    void say()
    {
        cout<<"Base say()"<<endl;
    }
public:
    void exec()
    {
        display();
        say();
    }
    void f1(string a)
    {
        cout<<"Base f1(string)"<<endl;
    }
    void f1(int a)
    {
        cout<<"Base f1(int)"<<endl;
    } //overload重载,两个f1函数在Base类的内部被重载
};
class DeriveA:public Base
{
public:
    void display()
    {
        cout<<"DeriveA display()"<<endl;    //override重写,基类中display为虚函数,故此处为重写
    }
    void f1(int a,int b)
    {
        cout<<"DeriveA f1(int,int)"<<endl;
    }//redefining,f1函数在Base类中不为虚函数,故此处为重定义
    void say()
    {
        cout<<"DeriveA say()"<<endl;
    } //redefining,同上
};
class DeriveB:public Base
{
public:
    void f1(int a)
    {
        cout<<"DeriveB f1(int)"<<endl;    //redefining,重定义
    }
};
int main()
{
    DeriveA a;
    Base *b=&a;
    b->exec();
    a.exec();
    a.say();
    DeriveB c;
    c.f1(1);
}
/**运行结果:
DeriveA display()
Base say()
DeriveA display()
Base say()
DeriveA say()
DeriveB f1(int)

Process returned 0 (0x0)   execution time : 0.623 s
Press any key to continue.
*/



1.成员函数重载特征:

a相同的范围(在同一个类中)

b 函数名字相同

 c 参数不同

 2 重写(覆盖)是指派生类函数覆盖基类函数,特征是:

 a 不同的范围,分别位于基类和派生类中

 b 函数的名字相同

 c 参数相同

d 基类函数必须有virtual关键字

3 重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。

b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值