您的位置:首页 > 编程语言 > C语言/C++

C++类类型成员函数的重载、覆盖与隐藏

2017-03-21 12:32 281 查看
类层次中的同名成员函数,有3种关系:重载overload,覆盖override和隐藏oversee,hide。

1.成员重载

只有在同一个类中定义的同名成员函数才存在重载关系,主要特点是函数的参数和数目不同,但不能是参数的个数和类型均相同,仅仅依靠返回值的不同来区分函数,和普通的函数重载是一样的,另外,重载和成员函数是否是虚函数无关。

class A{//下面都是重载关系的函数
...
virtual int fun();
void fun(int);
void fun(double,double);
static int fun(char);
...
};

成员重载函数的特征:

位于同一个类中
相同的函数名字
不同的参数列表
virtual关键字可有可无

2.成员函数的覆盖

覆盖是指在派生类和基类中的同名函数,但是基类函数必须是虚函数。主要特征是

分别位于基类和派生类中

有相同的函数名字

相同的参数,参数个数和类型

基类函数必须是虚函数,virtual

class A{
public:
virtual void func1(int,int){}

};
class B:public A{
public:
void func1(int,int ){}
};

与上面重载的区别是

覆盖是子类与父类之间的关系,是垂直关系;而重载是同一个类中不同的方法之间的关系,是水平关系。

覆盖要求的是参数列表相同,重载则要求参数列表不同;覆盖要求返回类型相同,重载无要求。

覆盖关系中,调用方法是根据对象的类型来决定的,重载关系是根据调用的实参表和形参表来选择方法的。

3.成员函数的隐藏

隐藏指的是在某些情况下,派生类中的函数屏蔽了基类中的同名函数。分为下面 两种情况
1)两个函数的参数相同,但是基类函数不是虚函数,和覆盖的区别是基类是否是虚函数
class A{
public:
void fun(int xp){
cout<<xp<<endl;
}
};
class B:public A{
public:
void fun(int xp){//将隐藏父类的fun函数
...
}
};

上面若想调用基类的同名函数,则需要加上域名进行指定

B b;
b.A::fun(2);

2)两个函数的参数不同,无论基类 函数是不是虚函数,基类函数都会被屏蔽,和重载的区别是两个函数是不是在同一个类中。
class A{
public:
virtual void fun(int xp){
cout<<xp<<endl;
}
};
class B:public A{
public:
void fun(char* xp){//将隐藏父类的fun函数
...
}
};
由于派生类中基类的同名成员函数被隐藏,所以调用的时候可能会出现问题。如果调用的是基类的成员函数则要进行域名指定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: