【知识摘要】面向对象C++---继承

继承概念:

     继承就是类与类之间一种特殊与一般的关系,可以通过已有的类可以派生出新类,新类继承父类的所有方法及数据。

     子类在继承父类的同时可以重写父类方法和属性,即覆盖父类原有方法和属性使其具备不同功能

      为子类增加新的成员数据和成员函数也是常见的做法。

为什么要继承:

     代码复用,避免臃肿代码,降低维护复杂度。

     父类功能已测试, 子类继承后调用父类相关接口正确性有保证。

     反应类与类间的关系(is a)

什么情况下可以继承:

     类和类之间有抽象层次关系,即一般与特殊关系,特殊继承一般类

多继承和单继承:

    C++支持子类可以继承多个父类(多继承)

    Java仅支持继承单个父类(单继承),但支持继承多个接口

    单继承模式下层次结构是树, 多继承下层次结构是图

    多继承机制会增加命名冲突的可能性:派生类与基类的冲突; 基类与基类的冲突,解决方式通过指定域解析符方式调用

虚继承:

    多继承机制会出现派生类从同一个间接基类中继承多次导致浪费和混淆

    可以通过指定virtual继承方式避免。

继承方式:

    公有继承 : 父类的成员函数和成员数据按父类中定义的可见性完全继承到子类中

    保护继承:父类的成员函数和成员数据,私有可见性完全继承到子类中, 公有及保护可见性按保护可见性接触到子类中

    私有继承:父类的成员函数和成员数据全部按私有可见性接触到子类中

    C++默认为私有继承

    样例: class a : public b

             {}

继承的可见性:

    基类的私有成员可以被子类继承,但子类中对基类的私有成员不可见

    基类的保护成员和公有成员在子类中均可见

    可通过using改变子类继承的父类成员的访问可见性,前提是对待改变的父类成员子类可见

    常用场景:父类的部分成员函数在子类中不适合暴漏则设为不可见。

    样例:

          class a : public b

          {

               private:

                   using b::mem;

          }

名字隐藏:

        如果子类新增数据成员与父类相同,则新增的数据成员隐藏继承自父类对应的数据成员

        如果子类新增成员函数名与父类相同,则新增的成员函数隐藏继承自父类对应的成员函数

        如果要访问则需要加域操作符 b::

间接继承:

        子类可以继承父类,也可以继承父类继承的父类信息

        即 继承可以从直接基类中派生 也可以从间接基类中派生

继承机制下的构造函数和析构函数:

        子类构造函数未显示调用父类构造函数时会在子类构造函数前调用父类默认构造函数

        子类构造函数显示调用父类构造函数时会在子类构造函数前调用指定的父类构造函数

        在层次很深的类层次结构中,创建一个派生类会触发派生链中所有类的构造函数从顶到底逐一调用

        子类是父类的特化,故先调用父类构造函数先执行,子类构造函数再调用做特化数据处理。

         析构函数的调用顺序与构造函数调用顺序刚好相反,个人理解是可能的前后依赖关系。

         析构函数一般用于资源释放,这样的顺序确保最近分配的资源最先释放。

         父类析构函数不显示调用原因是每个类只有一个析构函数, 不会出现调用二义性

         析构函数一般都设置为虚函数,避免析构调用的不彻底。


      



猜你喜欢

转载自blog.csdn.net/gougoubailove/article/details/80587868