码迷,mamicode.com
首页 > 编程语言 > 详细

C++之重载覆盖和隐藏

时间:2019-05-17 22:01:17      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:c++   不同   lock   str   block   类成员   round   实参   函数重载   

继承体系下同名成员函数的三种关系

  • 重载
  1. 在同一作用域内
  2. 函数名相同,参数列表不同(分三种情况:参数个数不同,参数类型不同,参数个数和类型都不同)
  3. 返回值类型可以相同也可以不同
  • 重写(覆盖)
  1. 在不同作用域内,分别在父类和子类
  2. 函数名相同,参数列表相同,返回值类型相同,协变除外(下面会介绍什么是协变)
  3. 基类函数必须有virtual关键字修饰
  4. 父子类中函数的访问修饰符可以不同
  • 重定义(隐藏)
  1. 在不同的作用域内,分别是父类和子类
  2. 函数名相同
  3. 在基类和派生类中只要不构成重写的都是重定义

重载

C++中函数重载达到的效果:

调用函数名相同的函数,根据实参的类型和个数选择相应的实现函数体执行。

函数重载是一种静态多态,或者称之为静态联编、静态绑定、静态决议,其实都一样。

重写/覆盖

在子类中定义一个与父类中完全相同的虚函数:

  1. 父类和子类中的虚函数,函数名、参数个数、参数类型以及返回值类型都相同,构成重写。
  2. 子类中的虚函数与父类中的虚函数,函数名、参数个数和类型都相同,只是返回值不同,父类的虚函数返回父类的指针或引用,子类虚函数返回子类的指针或引用,这种情况下也构成重写,我们称之为协变

C++中函数重写达到的效果:

在子类中重写了父类的虚函数,则子类对象调用该重写函数时从子类内部调用,而不是从父类继承,是一种动态多态。

在子类中重写了父类的虚函数,如果用一个父类指针或引用指向子类对象,那么该指针调用的是重写的虚函数,也即是子类的虚函数, 而如果一个父类指针指向父类对象,则调用父类的虚函数。

重定义/隐藏

指的是在不同作用域内,函数名相同,但不构成重写的则构成重定义。不仅仅是值类的成员函数,也可以是类的成员变量。

C++中重定义达到的效果:

如果再父类和子类中有相同名字的成员,子类中会将父类成员隐藏,此时无论在子类内部还是外部,通过子类成员会对象访问该成员,访问到的都是子类同名成员。

如果再子类内部或外部通过子类成员访问同名成员函数,则需要根据函数调用的规则来调用子类的同名成员函数,否则调用失败。

C++之重载覆盖和隐藏

标签:c++   不同   lock   str   block   类成员   round   实参   函数重载   

原文地址:https://www.cnblogs.com/phillee/p/10883840.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!