C++中覆盖、隐藏的区别

来源:互联网 发布:java replaceall 空格 编辑:程序博客网 时间:2024/05/17 07:06

基本规则:

    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");//均调用子类的Ad.B(1); pB->B(1);printf("\n");//分别调用各自的Bd.C(1); pB->C(1);printf("\n");//分别调用各自的Creturn 0;}

输出结果:


原创粉丝点击