【C++】 继承

概念:

        继承是面向对象程序设计使代码可以复用的重要手段,以往我们所接触的复用一般是函数复用,而继承是类程序设计层面的复用。

        被复用的类称为基类(父类),复用其他类的类称为派生类(子类)

定义格式:

【C++】 继承_第1张图片

 继承方式:

        

【C++】 继承_第2张图片

        PS:继承方式不一定要写,派生类使用关键字class默认继承方式为private,使用关键字struct默认继承方式为public。

 继承基类成员后访问方式的变化:

类成员/继承方式 public继承 protected继承 private继承
基类的public成员 派生类的public成员

派生类的protected成员

派生类的private成员
基类的protected成员 派生类的protected成员 派生类的protected成员 派生类的private成员
基类的private成员 在派生类中不可见 在派生类中不可见

在派生类中不可见

        PS:   不可见的意思是:基类的private成员还是被继承到了派生类,但是在语法上限制了派生类不管在类里面还是类外面都无法访问该私有成员。

        根据上述表格,我们可以发现基类中的private成员在派生类中都是不可见的;基类的其他成员在派生类的访问方式 = Min(成员在基类的访问限定符,继承方式),public>protected>private,以此来方便理解该表格。

【C++】 继承_第3张图片

基类和派生类中的赋值转换:

  • 派生类可以直接赋值给 基类对象 / 基类的指针 / 基类的引用 。这个过程可以称为切片或者切割。如下图所示:

        派生类只要将基类有的成员赋值即可,其余的切割掉。

        【C++】 继承_第4张图片

  • 基类对象不能赋值给派生类对象。
  • 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用,但是必须是基类的指针是指向派生类对象时才是安全的。如果基类是多态类型,可以使用RTTI的dynamic_cast来进行识别后安全转换。

继承中的作用域:

  1. 在继承体系中,基类和派生类都有独立的作用域     --->可以存在同名变量or函数
  2. 在基类和派生类中有同名成员,子类成员将屏蔽父类对同名函数的直接访问,这个过程叫做隐藏,也被称为重定义(在这种情况下,子类要访问父类中的同名成员可以通过  基类:基类成员  进行显示访问)----->PS:这里要与重载进行区分,重载是同一作用域下,而这里是在不同的两个作用域。
  3. 这里如果是成员函数的隐藏,只要是函数名相同也构成隐藏,如下图所示【C++】 继承_第5张图片

派生类的默认成员函数:

【C++】 继承_第6张图片

  1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。
  2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
  3. 派生类的operator=必须调用基类的operator=完成基类的复制。
  4. 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
  5. 派生类对象初始化先调用基类构造再调用派生类构造。
  6. 派生类对象析构清理先调用派生类析构再调用基类的析构。

【C++】 继承_第7张图片

继承中友元关系和静态成员

         友元关系不能继承,基类的友元不能访问子类的私有和保护成员。

        基类的静态成员,再子类继承基类后,整个继承体系也只存在一个静态成员,相当于子类只继承了静态成员的使用权

复杂的菱形继承以及菱形虚拟继承

        基本概念:

        单继承:一个子类只有一个直接父类。

        多继承:一个子类有两个或两个以上直接父类。

        菱形继承:多继承的一种特殊情况。

        多继承的格式:

class son: public person1 , public person2 //中间用逗号分隔

菱形继承如下图所示:

【C++】 继承_第8张图片

菱形继承会导致数据冗余和二义性;

二义性是指我们在Assistant中,访问继承中间Student和Teacher所继承最顶上的person成员时,不知道访问谁,可以通过指定类域解决。

而要更好的解决菱形继承所带来的问题,我们可以使用虚拟继承,就是在出现分歧的两个类中添加virtual关键字,如下

 【C++】 继承_第9张图片

你可能感兴趣的:(c++,java,开发语言)