1 函数重载(在一个作用域下)
定义: 函数名相同,函数入参不同(1 函数入参的个数不同,2 数据类型不同 3 参数顺序),也就是面向对象程序设计的多态性的实现,就是指同一个函数名可以实现不同的功能。
补充 :const也可以成为函数重载的依据,如果同时在类中,对于函数名相同的const函数和非const也可以构成函数重载。何时被引用呢?如果定义的对象是常对象,则调用的是常成员函数,如果定义的是非常对象,则调用的是非常成员函数。
更多关于const函数重载的知识,可以看这篇博客,链接如下:
http://blog.youkuaiyun.com/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。
写的不好,多多包涵。