美文网首页
继承中的类作用域(需要重新整理)

继承中的类作用域(需要重新整理)

作者: 安然_fc00 | 来源:发表于2017-04-05 20:51 被阅读0次
  • 每个类定义自己的作用域,在这个作用域内定义类的成员。当存在继承关系时,派生类的作用域嵌套在其基类的作用域内。因为有了嵌套作用域,派生类才能像使用自己的成员一样使用基类成员。
  • 一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。即使动态类型与静态类型不一致(比如基类指针或引用指向派生类)。

名字冲突与继承

  • 和其他作用域一样,派生类也能重新定义在其直接基类或间接基类中的名字,此时定义在内层作用域的名字将隐藏定义在外层作用域的名字。
  • 可以通过作用域运算符来使用被隐藏的基类成员。如Base::mem;(作用域运算符将覆盖掉原有的查找规则,指示编译器从Base类的作用域开始查找mem)。
  • 除了覆盖继承而来的虚函数之外,派生类最好不要重用其他定义在基类中的名字。

函数调用的解析过程

假定调用p->men(),则依次执行以下4步:

  • 首先确定p的静态类型。
  • 在p的静态类型对应的类中查找mem。如果找不到,则依次在直接基类中查找直至到达继承链的顶端。如果还是找不到,则编译器报错。
  • 一旦找到mem,就进行常规类型检查以确定对于当前找到的mem,本次调用是否合法。
  • 假设合法,则编译器将根据mem是否是虚函数而产生不同的代码:
    • 如果mem是虚函数且我们通过引用或指针进行的调用,则编译器产生的代码将在运行时确定到底运行虚函数的哪个版本,依据是对象的动态类型。
    • 如果mem不是虚函数或是通过对象(而非引用或指针)进行的调用,则编译器将产生一个常规函数调用。

基类与派生类中的虚函数必须有相同的形参列表。

如果两者的虚函数接受的实参不同,则无法通过基类的引用或指针调用派生类的虚函数。
因为如果两者的虚函数形参列表不同,则派生类的虚函数就无法覆盖基类的虚函数。

相关文章

  • 继承中的类作用域(需要重新整理)

    每个类定义自己的作用域,在这个作用域内定义类的成员。当存在继承关系时,派生类的作用域嵌套在其基类的作用域内。因为有...

  • 【前端学习笔记】JavaScript的 作用域与变量提升。

    作用域(scope) 在ECMAScript中,JavaScript只有两类作用域:全局作用域、函数作用域。 全局...

  • angularjs 指令 scope详解

    一个指令被创建后,你是希望它继承父类作用域,还是自己独创个独立作用域,还是一部分继承父类的,然后加上自己独创的呢?...

  • typescript笔记(二)

    一、作用域:全局作用域、局部作用域、类作用域 全局:可以在代码的任何位置使用; 局部:只能在声明它的代码块中; 类...

  • AngularJS中controller作用域的继承与隔离

    我在以前的文章里写过关于指令的作用域继承与格里,指令作用域继承与隔离,可以在 directive 中通过 scop...

  • 深入理解Angular作用域

    翻译自:Understanding Scopes 摘要 在AngularJS中,子作用域通常会原型继承于其父作用域...

  • static、const和extern

    一、 static 内部全局 作用域: 若在方法外:作用域为整个类,以及该文件中这个类下方的类中。 若在方法内:...

  • java类之进阶

    类中的变量作用域:一、成员变量概念:在一个类中,方法之外定义的变量称为成员变量性质:1.变量作用域为整个类,类中的...

  • 前端8大知识体系梳理

    一:JS原理类数据类型,作用域,原型,对象,继承,异步,递归等 二:JS框架类JQuery,React,Vue,A...

  • JavaScript之词法作用域

    作用域 在JS中作用域是一个相当重要的概念,我们一般把作用域分为两类:即静态作用域和动态作用域,JS采用的就是静态...

网友评论

      本文标题:继承中的类作用域(需要重新整理)

      本文链接:https://www.haomeiwen.com/subject/bvaaottx.html