(1)重载:这个最好理解:相同函数名,函数参数类型和数量不同,注意重载并不关心还回值类型,此外重载必须是在同一个类中。
(2)重写、覆盖是同一个东西:都是在继承和派生的时候才可能出现的情况,重写(覆盖)是指在派生类中存在重新定义函数,其函数名、参数类型和数量必须与基类中的函数保持一致,只有函数体(也就是花括号里面的内容)不同。重写的函数必须要有virtual关键字修饰,否则不能称之为重写或者覆盖。
(3)隐藏也是在继承和派生的时候才可能出现的情况,隐藏是指派生类的函数屏蔽了其基类的函数,注意只要派生类中函数名与基类中函数名相同,基类函数都会被隐藏。注意:隐藏方法无法实现多态性。
下面的例子证实了这一点:
class Base
{
public:
void fun(int,double) { cout << "Base::fun(int,double)" << endl; }
};
class Derive : public Base
{
public:
void fun(int) { cout << "Derive::fun(int)" << endl; }
};
int main()
{
Derive pd;
pd.fun(1);//Derive::fun(int )
pd.fun(0.01, 1);//错误:fun函数被隐藏
Base *fd = &pd;
fd->fun(1.0, 1);//正确,隐藏不能实现多态性 Base::fun(double ,int);
fd->fun(1);//隐藏不能实现多态,所以是错的
return 0;
}
总结:举个例子看看
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};
class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
int main(void)
{
Derived d;
Base *pb = &d;
Derived *fd = &d;
// Good : behavior depends solely on type of the object
pb->f(3.14f); //Derived::f(float) 3.14
fd->f(3.14f); //Derived::f(float) 3.14
// Bad : behavior depends on type of the pointer
pb->g(3.14f); //Base::g(float) 3.14
fd->g(3.14f); //Derived::g(int) 3
// Bad : behavior depends on type of the pointer
pb->h(3.14f); //Base::h(float) 3.14
fd->h(3.14f); //Derived::h(float) 3.14
system("pause");
return 0;
}
(1)f是覆盖或者重写, 不是重载
(2)g是隐藏不是重载和覆盖,因为不在一个类并且不是没有virtual关键字修饰
(3)h是隐藏不是重载和覆盖,因为不在一个类并且不是没有virtual关键字修饰
本文代码引用自这篇博文。