个人总结之重载、重定义、重写的区别

C++中发生继承时,常常或伴随着子类和父类之间函数或是数据成员的复制、重定义、重写;或是在本类中发生重载;

复制

当发生继承时,子类将会 复制父类 的全部成员;因此我们可以认为在子类中存在两个域:子类域、父类域;

 

重载(overload)

包括函数重载、运算符重载

特性

  • 函数处在相同的范围(即在同一个作用域中)

  • 返回值类型可同可不同,函数名字必须相同,参数列表(函数特征:参数类型、个数、顺序)必须不同,同时在函数末尾加上const修饰关键字同样可以构成函数的重载;

  • virtual 关键字可有可无

 

重定义(redefine)又叫隐藏,遮掩

隐藏是指派生类的函数屏蔽了与其同名的基类函数。注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏,而不是在派生类中发生重载

特性

  • 不在同一个作用域(分别位于派生类与基类)

  • 函数名字相同

  • 返回值可以不同

  • 参数不同,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)

  • 参数相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

 

重写(override)又叫覆盖、覆写

 

特性

  • 不在同一个作用域(分别位于派生类与基类)

  • 函数名字相同,参数列表相同,返回值相同(或是协变)。也即派生类的方法应与原来的函数完全相同(除了函数体中的内容)

  • 基类函数必须有 virtual 关键字,不能有 static,大概是多态的原因吧...

  • 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中仍然可重写为 public,protected

    在函数被virtual修饰的情况下,且父子类被virtual修饰的成员函数类型必须一摸一样,即参数列表和返回类型都必须一致(返回类型允许协变)。子类对象调用时,会直接调用子类域中的成员函数,父类域中的该同名成员就像不存在一样,(可以显示调用)即父类该成员被子类成员覆盖。这个就是我们说的发生多态来根据对象的类型决定调用的成员;但存在一种例外:就是 如果返回类型是 基类的引用或是指针,则可以修改为指向派生类的引用或是指针,这种允许返回类型随类类型的变化而变化的特性称为返回类型协变

 

总结

重载发生在同一个作用域内(同一个类中),virtual关键字可有可无,两个函数的返回值类型可同可不同, 函数名字必须相同,参数列表必须不同(函数特征:参数类型、个数、顺序);在函数后面加上const关键字修饰同样可以造成函数的重载。 
 
 
重定义(隐藏、遮掩)不在同一个作用域(分别位于派生类与基类)发生,virtual关键字可有可无,返回值类型可以不同, 函数名字必须相同,参数可不同也可相同。
 
 
重写(覆盖)不在同一个作用域(分别位于派生类与基类)发生, 基类函数必须有 virtual 关键字修饰,返回值相同(或是协变) ,函数名字相同,参数列表相同。也即派生类的方法应与原来的函数完全相同(函数体内容除外)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值