C++的重载,覆盖,隐藏
这三个概念对于初接触C++的人员是个老大难问题,曾经一度以为自己已经完全通了,偶一回头,发现居然又搞混了,再复习一次。
1、首先将其重载提取出来,重载针对的是一个类中的函数名相同,参数类型不周的情况(返回值不考虑)。
如下代码所示:
class A{
void (int a);
void (float a);
void (int a, int b);
};
2、再谈覆盖,这其实为C++多态性的一种应用,条件最严格:
子类函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致。
1)不同的范围(分别位于派生类与基类)
2)函数名字相同
3)参数相同
4)返回值类型相同
5)基类函数必须有关键字virtual关键字
注:派生类虚函数覆盖基类虚函数+隐藏基类中所有其他的重载函数
3、最后谈隐藏,隐藏为满足前两点(不同的范围,函数名字相同),而又没能同时满足后三点的情况。
代码示例:
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};
class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
int main(int argc, char* argv[])
{
Derived d;
Base *pb = &d;
Derived *pd = &d;
// Good : behavior depends solely on type of the object
pb->f(3.14f); // Derived::f(float) 3.14
pd->f(3.14f); // Derived::f(float) 3.14
cout<<"****************************************"<<endl;
// Bad : behavior depends on type of the pointer
pb->g(3.14f); // Base::g(float) 3.14
pd->g(3.14f); // Derived::g(int) 3 (surprise!)
cout<<"****************************************"<<endl;
// Bad : behavior depends on type of the pointer
pb->h(3.14f); // Base::h(float) 3.14 (surprise!)
pd->h(3.14f); // Derived::h(float) 3.14
cout<<"****************************************"<<endl;
}
代码说明:
(1)函数Derived::f(float)覆盖了Base::f(float)。
(2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。
(3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。