自学内容网 自学内容网

C++继承

一,继承概念

        是面向对象程序设计使让代码可以复用的重要手段,它允许程序员在保持原有的特性的基础上进行扩展,增加功能,这样产生新的新的类,称为派生。

定义:

        如图所示,Person是父类,也称为基类。。Student是子类,也称为派生类。

继承关系和访问限定符

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

总结:

        (1)基类的private成员在派生类中无论以什么方式都是不可见的。上面图片中的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类外还是在类内都不能去访问。

        (2)如果基类不想在类外被直接访问,但是需要被派生类访问,就定义为protected。由此可见,保护成员限定符是因为继承才出现。

        (3)使用关键字class时默认的继承方式是private,而struct默认的是public。因此使用时最好显示的写出来。

        (4)在实际的情况下派生类一般使用public,很好使用protect和private继承。

二,基类和派生类对象赋值和转换

        (1)派生类对象可以赋值给基类对象/基类的指针/积累的引用。(可以形象的称为切片或者切割,原理就是把父亲那一部分赋值过去

        (2)基类对象不能赋值给派生类对象。

        (3)基类的指针或者引用时不会产生中间变量。

三,继承中的作用域

        (1)在继承中基类派生类都具有独立的作用域。

        (2)子类和父类中有相同的成员,子类成员将屏蔽父类成员中的同名成员函数,这种情况叫隐藏也叫重定义使用基类::基类成员  显示访问

        (3)隐藏函数只需要满足父子的函数名相同即可。(这里的相同的函数不是函数的重载,因为作用域不相同

        (4)在实际的情况下尽量不要定义相同的函数名。

        (5)当成员名相同时,按就近原则使用派生类的成员。

四,默认成员函数

        (1)  派生类的构造函数必须调用基类的构造函数积累的那一部分成员。如果基类没有没有默认的构造函数,则要在派生类的初始化列表阶段进行显示的调用。

        (2)派生类拷贝构造时,当有基类的成员函数时需要调用积累的拷贝构造完成拷贝初始化。

        (3)派生类的operator=,当有基类的operator=时需要调用基类的完成复制。

        (4)派生类的初始化先调用基类的初始化再调用派生类的构造

        (5)派生类对象进行析构时先派生再基类。因为这样才能保证先把派生类成员清理完之后再把积累的成员进行清理。

         (6)写析构函数时只需要写派生类的析构函数,因为编译器会对析构函数名进行特殊的处理,处理成destructor(),所以父亲类的析构函数不加virtual时,基类和派生类的析构函数构成隐藏关系。

五,继承与友缘

        基类的友缘不能被派生类继承。

六,继承与静态成员、

        基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。(派生类可以用)

七,继承的中的多继承

        单继承:一个子类只有一个直接父类时称这个继承关系为单继承。

多继承:一个子类有一个或者多个直接父类时称为这个继承的关系为多继承。

菱形继承:菱形继承是多继承里面的特殊情况

菱形继承问题:从下面图片可以看出菱形继承会有数据的沉余和二义性问题。当它们交叉部分的基类继承的派生类会有两份。

解决方法:虚拟继承(关键字: virtual)可以解决菱形继承的二义性和沉余的问题(注意:虚拟继承不要在其它地方使用)

注意:如果下图student和teacher后面不加virtual会报错。

八,继承和组合

        (1)public继承是一种is-a关系。(父类的public和protected都可以访问)。

        (2)组合是一种has-a关系。(父类的public可以访问,但是protected不可以访问)。

        (3)如果一对象组合和继承都可以使用优先选择组合。(低耦合高内聚)


原文地址:https://blog.csdn.net/ff0823/article/details/142767513

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!