成员函数的重载,覆盖和隐藏

什么是函数重载:
在C++程序中,可以将语义,功能相似的函数用同一个名字表示,即就是函数重载。

函数重载的原因:
(1)便于记忆,提高函数的易用性;
(2)类的构造函数需要重载机制;(因为c++规定构造函数与类同名,构造函数只能有一个名字,若要有不同的方法创建对象,只能依靠重载)

成员函数被重载的特征:
(1)在同一个类范围内;
(2)函数的名字相同
(3)函数的参数不同
(4)virtual关键字可有可无;
eg:

#include <iostream>

using namespace std;

class base
{
public:
    base(){}
    ~base(){}
public:
    void fun()
    {
        cout<<"base::fun()"<<endl;
    }
    void fun(int x)
    {
        cout<<"base::fun(int)"<<endl;
    }
private:
    int data;
};

int main()
{
    base b;
    b.fun();
    b.fun(8);
    return 0;
}

测试结果:
此处的base中的fun()和fun(int)构成了函数重载;

[root@localhost C++]# vim test.cpp
[root@localhost C++]# g++ test.cpp -o test
[root@localhost C++]# ./test 
base::fun()
base::fun(int)
[root@localhost C++]# 

注意:要防止隐式类型转换;
eg:

void fun(int){}
void fun(float){}
当传入参数是0.5时编译器会因为隐式类型转换而不知道要调用哪一个函数,所以要进行显示调用即:
fun(int(0.5));
或
fun(float(0.5));

成员函数的覆盖:
(覆盖是指派生类函数覆盖基类函数)
覆盖的特征:
(1)分别位于派生类基类范围;
(2)函数名字相同
(3)函数的参数相同
(4)基类函数必须有virtual关键字

eg:

#include <iostream>

using namespace std;

class base
{
public:
    base(){}
    ~base(){}
public:
    virtual void fun()
    {
        cout<<"base::fun()"<<endl;
    }
private:
    int data;
};

class D : public base
{
public:
    D(){}
    ~D(){}
public:
    void fun()
    {
        cout<<"D::fun()"<<endl;
    }
};


int main()
{
    D d;
    d.fun();
    return 0;
}

此处的D中的fun()函数覆盖了父类base中的fun()函数;
若父类中的fun()函数没有关键字virtual,main()中调用的就是base中的fun()函数;加了virtual关键字父类的fun()函数被虚拟继承,就只能调用D自己的fun()函数;

成员函数的隐藏:
隐藏是指派生类的函数屏蔽了与其同名的基类函数
隐藏的特征:
(1)若派生类的函数与基类的函数同名,但是参数不同,则无论基类的函数有无virtual关键字,基类函数都将被隐藏
(2)若派生类的函数与基类的函数同名同参,并且基类函数**有无
virtual**关键字,基类函数将被隐藏

第(1)种

#include <iostream>

using namespace std;

//父类base::fun()没有virtual关键字,但和子类D::fun()同名,不同参,因此父类的fun()函数被隐藏;

class base
{
public:
    base(){}
    ~base(){}
public:
    void fun()
    {
        cout<<"base::fun()"<<endl;
    }
private:
    int data;
};

class D : public base
{
public:
    D(){}
    ~D(){}
public:
    void fun(int)
    {
        cout<<"D::fun(int)"<<endl;
    }
};


int main()
{
    D d;
    d.fun(3);
    return 0;
}

测试结果如下:

[root@localhost C++]# ./test 
D::fun(int)
[root@localhost C++]# 

第(2)种

#include <iostream>

using namespace std;

//父类base::fun()
与子类D::fun()同名同参,所以父类的fun()函数被隐藏

class base
{
public:
    base(){}
    ~base(){}
public:
    virtual void fun()
    {
        cout<<"base::fun()"<<endl;
    }
private:
    int data;
};

class D : public base
{
public:
    D(){}
    ~D(){}
public:
    void fun()
    {
        cout<<"D::fun()"<<endl;
    }
};


int main()
{
    D d;
    d.fun();
    return 0;
}

测试结果如下:

[root@localhost C++]# g++ test.cpp -o test
[root@localhost C++]# ./test 
D::fun()
[root@localhost C++]# 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值