类继承中的重载,覆盖和隐藏

本文通过一个具体的C++代码示例,详细解析了函数的隐藏与重载的区别,解释了为何子类中的函数调用未能找到父类中的同名函数,并探讨了覆盖、重载与隐藏的概念。

大家看看这个程序会有什么错误呢?

class B{
public:
	virtual void f(int){
		cout<<"B"<<endl;
	}
};
class D:public B
{
public:
	void f(int,int){
		cout<<"D"<<endl;
	}
	void test(){
		f(1);
	}
};

编译时报告:error C2660: 'f' : function does not take 1 parameters,

f函数没有使用1个参数,这说明test()中看不到f(int)函数,为什么呢?难道这不是重载吗?子类不能继承父类的函数吗?

先看看覆盖(Override)的定义

 

1 如果基类中的函数和派生类中的两个名字一样的函数f

  满足下面的两个条件
  (a)在基类中函数声明的时候有virtual关键字
  (b)基类中的函数和派生类中的函数一模一样,函数名,参数,返回类型都一样

    (多态性质)

 

2 重载(overload):

        必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征

重载必须在一个域中,父类与子类不是一个域,所以不能称为Overload。

       Note: 重载函数指的是函数名相同,参数类型和个数不同,不考虑返回类型。

        如 int average(int,int);

            double average(int,int);

           这不是函数重载,编译器认为是重定义:C2371: 'f' : redefinition; different basic types

 

 

3 隐藏(hide):

  指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义 。

       换句话说,子类中的同名函数隐藏了父类中的同名函数(同名函数:名字相同的函数,不涉及参数类型,参数个数等),在子类中只能看见子类中的同名函数。

 

 

所以,相同的函数名的函数,在基类和派生类中的关系只能是覆盖或者隐藏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值