对于函数重载-函数覆盖-函数隐藏的区别

1 函数重载(在一个作用域下)
定义: 函数名相同,函数入参不同(1 函数入参的个数不同,2 数据类型不同 3 参数顺序),也就是面向对象程序设计的多态性的实现,就是指同一个函数名可以实现不同的功能。
补充 :const也可以成为函数重载的依据,如果同时在类中,对于函数名相同的const函数和非const也可以构成函数重载。何时被引用呢?如果定义的对象是常对象,则调用的是常成员函数,如果定义的是非常对象,则调用的是非常成员函数。
更多关于const函数重载的知识,可以看这篇博客,链接如下:
http://blog.csdn.net/sun19910114/article/details/40051713
注意: 函数返回值无法实现函数重载,因为在调用函数的时候可以选择接收或者丢弃返回值,所以编译系统无法判断你是调用有返回值的函数然后丢弃返回值,还是调用没有返回值的 函数。所以 ,函数返回值无法实现函数重载。
判别函数重载的第一要素就是:函数名称。

#include <iostream>
using namespace std;
void fun(int a, int n)
{
    cout << "hh" << endl;
}
void fun(int n,int a[]) //入参顺序
{
    cout << "gg" << endl;
}
void fun(int n)     //入参个数
{
    cout << "ee" << endl;
}
void fun(char a)  //入参类型
{
    cout << "aa" << endl;
}
//int fun(char a)//error  

int main()
{
    int a = 8;
    char b='a';
        fun(a);
       fun(b);
    return 0;
}

2 函数覆盖 (重写,在不同的作用域下,分别位于派生类与基类)
函数重写:是指派生类重新定义基类的虚函数,函数名相同,参数相同,返回值相同,基类必须有virtual 关键字。

3 函数隐藏(也称重定义,同的作用域下,分别位于派生类与基类)
函数隐藏:函数名字相同,返回值可以不同;
参数不同,此时,无论有无 virtual 关键字,基类函数被隐藏 ;
参数相同,基类函数没有virtual关键字,基类函数被隐藏.

   #include <iostream>
using namespace std;

class Base
{
public :
    virtual void fun()  //A
    {
        cout << "gg" << endl;
    }
    int fun(int c)   //B
    { 
        cout << "c=" << c << endl;
        return c;
    }
};
class Inherit :public Base
{
public: 
    void fun()    //C
    {
        cout << "ff" << endl;
    }
    int fun(int c)   //D
    {
        cout << "dss" << endl;
        return c;
    }
};
int main()
{
    int c = 10;
    Inherit obj2;
    obj2.fun(10);
    obj2.Base::fun(10);
    obj2.fun();
    return 0;
} 
 在上面代码中,在派生类和基类中都各自重载了fun成员函数;

A和C是函数重写,B和D是函数隐藏,隐藏了基类的B。
写的不好,多多包涵。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值