首先,从概念上分析,
覆盖条件是:
1. 派生类函数与基类函数同名,
2.函数的参数不同
3.基类函数有Virtual关键字。
隐藏条件是:
1.派生类函数与基类函数同名
2.基类函数无Virtual关键字
3.函数参数可以相同也可以不同。
其次,从使用上分析,
如果派生类覆盖了基类的函数,则使用动态对象为派生类的指针来调用该函数时,其实,真正调用的是派生类的函数。
如果派生类隐藏了基类的函数,基类的函数在派生类中是不可见的。
这时,使用派生类对象调用基类的同名函数时,如果派生类不能进行类型自动转换,则编译出错,否则,会调用派生类进行类型转换后的函数。
使用基类对象时,即使该对象的动态类型为派生类,但是,在调用一个非Virtual函数时,仍然是Base类中的函数。
void main(void)
{
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
// 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!)
// 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
}