博文内容:重载、重定义(隐藏),重写(覆盖)
三重区别及联系
- 概念
- 联系及区别
- 1、作用域
- 2、函数要求
概念
重载
函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。
首先就是对于重载的解释,函数名相同但是参数不同。
class Base
{
public:Base(){cout << "Base()" << endl;}void Func(){cout << "Func()" << endl;}void Func(int){cout << "Func(int)" << endl;}//err//int Func(int)//{//}//~Base()//{// cout << "~Base()" << endl;//}private:};
重定义
重定义 (redefining)也叫做隐藏: 子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。
一般是出现在继承中,对于派生类中函数名与基类中的函数名相同的成员函数。构成重定义。相较于函数重载来说,需要对于参数之类要求只是需要对于函数名相同即可。
class Base
{
public:Base(){cout << "Base()" << endl;}virtual void Func(){cout << "Base::Func()" << endl;}void Func(int){cout << "Func(int)" << endl;}private:};class child:public Base
{
public:virtual void Func(){cout << "child::Func()" << endl;}
private:int _c;
};
重写
子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改。
和重定义的区别就是关键字virtual
,基类中存在函数前面使用virtual
就是虚函数。与重定义一样都必须是在基类和子类中才会出现这样的定义。但是与重定义的区别在于函数名,参数,返回值都必须相等。也有特例出现例如:
就是对于析构函数,析构函数在底层被取名为destructor,统一命名就会出现对于虚函数实现。
协变(基类与派生类虚函数返回值类型不同)
派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指
针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变
联系及区别
1、作用域
1、重载要求在同一个作用域。
2、 重写(覆盖)、重定义(隐藏)在基类和派生类2个作用域。
2、函数要求
1、重载函数的函数数名相同但是参数不同。
2、重写函数函数名、参数、返回值(协变例外),且都需要有关键字virtual。
3、重定义函数在重写函数的规则上,少了关键字virtual。