什么是函数重载:
在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++]#