对于重载:其范围首先是在同一个类中,基本条件为函数名相同,参数不同(包括类型,个数,顺序),返回类型不影响。
对于覆盖:首先是存在父子关系的类中,也就是不同类中。覆盖的条件是 基类中 函数必须存在virtual关键字,而且在派生类中,有一个同函数名,且参数也相同的函数。此时则为覆盖。
对于隐藏:也是在父子关系的类中,出现了同名函数,只要不是覆盖,就是隐藏。
隐藏的角度:隐藏是对于派生类来说。派生类中隐藏了基类的函数。也就是在派生类中将找不到隐藏的父类成员函数。
对于成员变量来说,也有隐藏。隐藏同名的成员变量。
下面是一个简短的实例:
//隐藏 覆盖 重载的区别
class A
{
public:
virtual void func(int data){cout<<"class A :"<<data<<endl;}
void func(char *str){cout<<"class A :"<<str<<endl;}
};class B:public A
{
public:
void func(){cout<<"function in B without parameter."<<endl;}//隐藏基类函数
void func(int data){cout<<"class B :"<<data<<endl;} // 覆盖基类函数
void func(char *str){cout<<"class B :"<<str<<endl;} //隐藏基类函数而且他与func()重载
};
void main()
{
A *pa;
B b;
pa=&b;
pa->func(1); // class B : 1
pa->func("haha"); //class A:
b.func(); //class B:
b.func("haha"); // class B :
b.func(1); // class B:1
}