一、重载
简单来说,就是函数名相同,参数列表不同,即同名不同参,即可构成函数的重载。
《高质量C++/C编程指南》列出了重载的特性:
(
1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。
可以理解为重载的函数是两个不同的函数,在调用是,编译器会自动根据参数的情况调用其对应的函数
如:
#include<iostream>
using namespace std;
class C
{
public:
void Cprint()
{
cout<<"This is print one"<<endl;
}
void Cprint(int a)
{
cout<<"This is print two"<<endl;
}
void Cprint(int a,int b)
{
cout<<"This is print three"<<endl;
}
};
void main()
{
C c;
c.Cprint();
c.Cprint(10);
c.Cprint(10,20);
}
可以看到结果
根据传递的参数不同编译器所调用的函数也是不同的。
值得注意的是:函数重载时,返回值类型可以不同,但如果仅仅是返回值类型不同的话是无法构成重载的
即
class C
{
public:
void Cprint()
{
cout<<"This is print one"<<endl;
}
int Cprint()
{
cout<<"This is print two"<<endl;
return 0;
}
};
此类情况无法构成重载,编译时就会出错。
二、覆盖和隐藏
覆盖和隐藏这两个概念很容易将人搞混,我们先从例子来看一下隐藏跟覆盖
class A
{
public:
void show()
{
cout<<"This is A"<<endl;
}
};
class B:public A
{
public:
void show()
{
cout<<"This is B"<<endl;
}
};
void main()
{
B b;
b.show();
}
这种称之为同名隐藏,切记,一定要同名同参,在子类继承基类时,子类中的成员函数会自动隐藏基类当中的同名同参函数。
隐藏后,通过子类构造的对象在调用该函数时,就不会调用基类中的函数,相当于基类中的函数还在,但是已经被子类所隐藏掉了。
其隐藏的特点是:
1.子类的函数与父类的名称相同,但是参数不同,父类函数被隐藏
2.子类函数与父类函数的名称相同,参数也相同,但是父类函数没有virtual,父类函数被隐藏
与之相似的是覆盖,覆盖是指子类覆盖父类函数,其特点:
1.分别位于子类和父类中
2.函数名字与参数都相同
3.父类的函数是虚函数(virtual)
即在父类的函数前面加virtual,如此便构成覆盖,这也是实现多态的基础之一。
人生是,美梦与热望