C++之重载覆盖和隐藏

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

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

重载spa

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

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

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

重写/覆盖作用域

在子类中定义一个与父类中彻底相同的虚函数:变量

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

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

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

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

重定义/隐藏

指的是在不一样做用域内,函数名相同,但不构成重写的则构成重定义。不单单是值类的成员函数,也能够是类的成员变量。

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

若是再父类和子类中有相同名字的成员,子类中会将父类成员隐藏,此时不管在子类内部仍是外部,经过子类成员会对象访问该成员,访问到的都是子类同名成员。

若是再子类内部或外部经过子类成员访问同名成员函数,则须要根据函数调用的规则来调用子类的同名成员函数,不然调用失败。

相关文章
相关标签/搜索