zoukankan      html  css  js  c++  java
  • 类继承的作用域、函数隐藏、重载函数覆盖

    https://www.cnblogs.com/tianzeng/p/9775672.html

    一、基类与派生类的作用域关系

    1、每个类定义自己的作用域,在这个作用域内我们定义类的成员;

    2、派生类的作用域位于基类作用域之内;

    二、成员函数调用

    1、一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的;即使静态类型与动态类型可能不一致,但我们能使用哪些成员仍然是有静态类型决定的

    2、名字冲突与继承:派生类能重用定义在其直接基类或间接基类中的名字,此时定义在内层作用域(即派生类)的名字将隐藏定义在外层作用域(即基类)的名字;

    3、通过作用域运算符来使用隐藏的成员:

    struct Derived : Base {
    int get_base_mem(){return Base::mem; }
     //...
    };

    4、名字查找先于类型检查:

    (1)声明在内层作用域的函数并不会重载声明在外层作用域的函数(定义派生类中的函数也不会重载其基类中的成员函数);

    (2)如果派生类的成员与基类的某个成员同名,则派生类将在其作用域内隐藏该基类成员;即使派生类成员与基类成员的形参列表不一致,基类成员仍然会被隐藏掉(但是可用基类指针来访问基类被覆盖的函数);

      可用override关键字来避免出现派生类重写虚函数时,出现函数参数不一致情况;

    7、虚函数与作用域:如果基类与派生类的虚函数接受的实参不同,则无法通过基类指针或引用调用派生类的虚函数;

    二、覆盖重载的函数:

    1、场景:派生类需要覆盖基类重载函数集合中的部分而非全部函数;

    2、说明:

    (1)成员函数无论是否是虚函数都能被重载;

    (2)派生类可以覆盖重载函数的0个或多个实例(全部覆盖或者一个都不覆盖)

    (3)要重载的基类函数在派生类中必须可以访问;

    3、实现

    (1)using声明语句:{... using Base::fun1 ...}

    (2)重新定义重载函数集合中的部分函数,当用派生类调用时,会调用派生中被重写的函数;

    (3)对派生类没有重新定义的重载版本函数的访问实际上是对using声明点的访问;

  • 相关阅读:
    打开一个网页,以html代码保存于txt文件中
    用C查看系统任务管理器中运行的程序
    常见两种LINK错误
    怎么把下载的dll和def生成lib,以用于编程
    建立一个不能打开的文件(占坑)C语言高级API调用
    [转]软件版本命名格式
    回调函数编写和注重点
    ubuntu linux mysql 开发模式与连接编译
    创建一个进程和两个管道,实现与进程通信
    hdoj 1115 Lifting the Stone (求多边形重心)
  • 原文地址:https://www.cnblogs.com/wllwqdeai/p/13616683.html
Copyright © 2011-2022 走看看