一、重载(overload)
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;
二、覆盖(override)是指派生类函数覆盖基类函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数必须相同,即使参数协变也不行
(4)基类函数必须有 virtual 关键字。
(5)返回值相同(或是协变),否则报错;有关 协变 的概念见 请见本人的另一篇文章http://blog.csdn.net/miyunhong/archive/2009/09/16/4557517.aspx
三、重写 (overwrite)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 。
class CA
{
public:
CA(int a, int b)
{
a_ = a;
b_ = b;
}
public:
void fun()
{
}
private:
int a_, b_;
};
class CB : public CA
{
//using CA::CA; C++11才支持
public:
CB(int a, int b, int c) :CA(a, b)
{
c_ = c;
}
public:
void fun(int i)
{
}
private:
int c_;
};
int main()
{
CB b(2, 5); // 错误 子类的构造函数覆盖了父类的构造函数
CB b2(1, 2, 3);//OK
b2.fun(); // 错误 子类的void fun(int i)覆盖了父类的void fun()
b2.fun(2); //OK
}