基本规则:
1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
事例代码:
/**************************************************************************
* @Copyright (c) 2013, ChenMH, All rights reserved.
* @file : main.cpp
* @version : ver 1.0
* @author : ChenMH
* @date : 2013/06/27 14:51
* @brief : 测试C++中覆盖、隐藏的区别。因重载比较简单,不再实验。
**************************************************************************/
#include <cstdio>
class CBase
{
public:
virtual void A(int ival){printf(" CBase::A() ");}
void B(int ival){printf(" CBase::B() ");}
void C(int ival){printf(" CBase::C() ");}
};
class CDerive : public CBase
{
public:
virtual void A(int ival) //覆盖父类的A:函数名、参数完全相同,且父类一定要有virtual
{printf(" CDerive::A() ");}
void B(int ival) //隐藏父类的B:函数名、参数完全相同,且父类无virtual
{printf(" CDerive::B() ");}
void C(float ival) //隐藏父类的C:函数名相同、与数不同,与virtual无关
{printf(" CDerive::C() ");}
};
int main()
{
CDerive d;
CBase* pB = &d;
d.A(1); pB->A(1);printf("\n"); //均调用子类的A
d.B(1); pB->B(1);printf("\n"); //分别调用各自的B
d.C(1); pB->C(1);printf("\n"); //分别调用各自的C
return 0;
}
输出结果: