大家看看这个程序会有什么错误呢?
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):
指的是派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以这么理解:在调用一个类的成员函数的时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,所以如果一个派生类和一个基类都有同一个同名(暂且不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么我们就说这个派生类的成员函数"隐藏"了基类的成员函数,也就是说它阻止了编译器继续向上查找函数的定义 。
换句话说,子类中的同名函数隐藏了父类中的同名函数(同名函数:名字相同的函数,不涉及参数类型,参数个数等),在子类中只能看见子类中的同名函数。
所以,相同的函数名的函数,在基类和派生类中的关系只能是覆盖或者隐藏。
本文通过一个具体的C++代码示例,详细解析了函数的隐藏与重载的区别,解释了为何子类中的函数调用未能找到父类中的同名函数,并探讨了覆盖、重载与隐藏的概念。

869

被折叠的 条评论
为什么被折叠?



