C++:
一、重载(overload)
指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;
二、重写(也称为覆盖 override)
是指派生类重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—只要原来的返回类型是指向基类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。这样的类型称为协变返回类型。
(6)重写函数的访问修饰符可以不同。尽管 virtual 是 public 的,派生类中重写改写为private,protected 也是可以的
例:
#include <iostream>
using namespace std;
class A {
public:
virtual void fun3(int i) {
cout << "A::fun3() : " << i << endl;
}
};
class B : public A {
private: // 重写函数的访问修饰符可以不同
// 重写/覆盖
virtual void fun3(int i) {
cout << "B::fun3() : " << i << endl;
}
};
int main()
{
A a;
B b;
A * pa = &a;
pa->fun3(3);
pa = &b;
pa->fun3(5);
return 0;
}
输出:
三、重定义(也成隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)**参数不同。**此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
(5