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

类层次中的同名成员函数,有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函数
		...
	}
};
由于派生类中基类的同名成员函数被隐藏,所以调用的时候可能会出现问题。如果调用的是基类的成员函数则要进行域名指定




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值