C++中的覆盖和隐藏详解
继承是面向对象编程的重要特性在c中当父类与子类出现同名函数时会出现两种情况覆写和隐藏本文主要讨论c中这两种情况的特点和使用区别2. 共性当子类继承父类并且子类中有父类同名函数那么子类将隐藏父类中所有同名函数不可以对父类中同名函数直接进行访问此时子类调用父类中函数需要用域操作符::1234567891011121314151617181920212223242526272829#includeiostreamusingnamespacestd;classA{public:voidfun1(){coutA::fun1()endl;}voidfun1(int){coutA::fun1(int)endl;}voidfun2(){coutA::fun2()endl;}};classB:publicA{public:voidfun1(){coutB::fun1()endl;}};intmain(){B b;b.fun1();//调用子类b的fun1()函数//b.fun1(3);尝试调用父类fun1(int)函数会报错error:no matching function for call to B::fun1(int)b.A::fun1();//调用父类A的fun1()函数b.A::fun1(3);//调用父类A的fun1(int)函数b.fun2();//调用父类A的fun2()函数return0;}b调用fun1()函数会调用子类b的fun1()函数而尝试使用b.fun(3)调用父类的void fun(int)函数时会报错因为父类中的同名函数都被隐藏。此时调用父类中函数的方法是使用域操作符::。当父类中同名函数拥有virtual修饰符修饰时此时子类对父类函数进行覆写1234567891011121314151617181920212223242526272829#includeiostreamusingnamespacestd;classA{public:virtualvoidfun1(){coutA::fun1()endl;}voidfun1(int){coutA::fun1(int)endl;}voidfun2(){coutA::fun2()endl;}};classB:publicA{public:virtualvoidfun1(){coutB::fun1()endl;}};intmain(){B b;b.fun1();//调用子类b的fun1()函数//b.fun1(3);尝试调用父类fun1(int)函数会报错error:no matching function for call to B::fun1(int)b.A::fun1();//调用父类A的fun1()函数b.A::fun1(3);//调用父类A的fun1(int)函数b.fun2();//调用父类A的fun2()函数return0;}可见即使是虚函数覆写也会隐藏父类中的所有同名函数。当子类与父类有同名函数无论是覆写还是隐藏的方式在子类自身进行函数调用时会调用子类函数而隐藏父类的所有同名函数要访问父类函数需要通过域操作符进行访问。3. 区别覆写与隐藏的区别可以体现在基类指针的使用上比如以下程序1234567891011121314151617181920212223242526272829303132333435#includeiostreamusingnamespacestd;classA{public:voidfunction1(){coutA::function1endl;}virtualvoidfunction2(){coutA::function2endl;}};classB:publicA{public://隐藏基类function1voidfunction1(){coutB::function1endl;}};classC:publicA{public://覆写基类function2virtualvoidfunction2(){coutC::function2endl;}};intmain(){A *a;B b;C c;ab;a-function1();ac;a-function2();return0;}b隐藏基类的同名函数function1()当基类指针a指向子类b时调用的是a的function1()函数而子类c覆写a的同名函数function2()当基类a指针指向子类c调用的是c的function2()函数。利用覆写的特点可以实现c的多态特性。4. 区分隐藏当父类函数与派生类函数同名并且父类函数无virtual关键字修饰无论父类与派生类参数个数与类型是否相同此时派生类函数隐藏父类所有同名函数覆写当父类函数与派生类函数同名并且参数相同返回值相同并且父类函数有virtual关键字修饰此时派生类函数覆写父类函数5.参考文章C继承中的重载覆盖和隐藏总结本篇文章就到这里了希望能够给你带来帮助