函数重载(overload)
函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:
(1)相同的范围(在同一个作用域中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无(注:函数重载与有无virtual修饰无关);
(5)返回值可以不同;
class AA
{
public:
void print()
{
cout << "父类" << endl;
}
void print(int x )
{
cout << "父类:" << x << endl;
}
};
函数重写(也称为覆盖 override)
函数重写是指子类重新定义基类的虚函数。特征是:
(1)不在同一个作用域(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同,否则报错;
(6)重写函数的访问修饰符可以不同;
class AA
{
public:
virtual void print(int x )
{
cout << "父类:" << x << endl;
}
};
class BB : public AA
{
public:
virtual void print(int x)
{
cout << "子类:" << x << endl;
}
};
重定义(也称隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆);
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆);
class AA
{
public:
void print()
{
cout << "父类" << endl;
}
};
class BB : public AA
{
public:
void print(int x)//这叫重定义,此时A类中的print()被隐藏
{
cout << "子类:" << x << endl;
}
};