函数重写(覆盖)
定义:子类重新定义父类中有相同名称,返回值和参数的虚函数,主要在继承关系中出现。
基本条件:
- 重写的函数和被重写的函数必须都为virtual函数,并分别位于基类和派生类中
- 重写的函数和被重写的函数,返回值,函数名,函数参数必须完全一致
#include<iostream>
using namespace std;
class father{
public:
virtual void fun(){
cout <<"father"<<endl;
}
};
class child:public father{
public:
virtual void fun(){
cout<<"child"<<endl;
}
};
/*最后输出child,子类中的virtual可以省略*/
函数隐藏
定义:在子类中只要和父类函数名字相同,不是重写就是函数隐藏
隐藏与重写区别:在子类和父类中,函数名相同,参数相同,父类中的同名函数没有virtual为关键字,为隐藏。
#include<iostream>
using namespace std;
class Base{
public:
void fun(){cout << "funA()" <<endl;}
virtual void funB(){cout <<"funB()"<<endl;}
};
class Heri:public Base{
public:
void funA(){cout<<"funA():Heri"<<endl}//函数隐藏,非虚函数,父类中没有virtual
void funA(int a){cout<<"fun A(int a):Heri"<<endl;}//函数隐藏参数不同
void funB(){cout<<"fun B():Heri"<<endl;}//重写 子类省去virtual
}