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声明点的访问;

  • 相关阅读:
    linux C总结篇(进程)
    进程与线程的区分
    递归的两种思路
    Linux下git与github的一般使用
    文件读写和文件指针的移动
    文件的创建,打开与关闭
    一个简单脚本
    linux 三剑客命令(grep,sed ,awk)
    常用正则表达式
    PAT:1002. A+B for Polynomials (25) 部分错误
  • 原文地址:https://www.cnblogs.com/wllwqdeai/p/13616683.html
Copyright © 2011-2022 走看看