首页 > 其他分享 >4月14日继承与多态

4月14日继承与多态

时间:2023-04-14 23:45:07浏览次数:30  
标签:函数 继承 派生类 多态 基类 重写 14

所以说继承到派生类的基类成员初始化必须调用基类自己的构造函数,如果派生类无权调用基类的构造函数那么也就无法继承了。

还有要注意的是一个派生类无法继承基类的友元函数,就是说一个类以外的友元函数可以访问基类的私有变量但是无法访问继承基类的派生类的私有变量,

静态成员的继承:当一个派生类继承基类的静态变量后派生类也跟着具有管理这个静态变量的权力,不过他们管理的是同一个静态变量,也就是说继承系统中的静态成员变量从始至终只有一个,

菱形继承;一个派生类可以同时有多个基类,所以就会出现两个派生类继承同一个基类,而这两个派生类也可以同时做一个派生类的基类,那么最后这个派生类可能会存在两个相同的第一个基类的成员变量,数据就会变得有些冗余,也会出现当访问时不知道访问哪一个基类成员的二义性,所以菱形继承很复杂能不用就尽量不用,

比如Person作为一个总的基类,其有两个派生类分别是Student和Teacher,而这两个派生类又同时作为Assistant的基类,那么Assistant不仅继承了Teacher的name成员也继承了tudent的name成员,就造成了不必要的数据冗余和二义性,二义性的问题可以通过显示访问基类来解决,但是数据冗余就得通过其他方法来解决,

虚继承可以很好地解决这个问题,最后一个派生类继承到的同名成员会只显示最后那个,而中间两个基类的同名成员会显示一个指针,这个指针指向一个偏移量,然后指针通过这个偏移量来计算真正储存同名成员的地址。

而组合和继承都是类的复用,但是他们之间有着区别,组合的耦合度低,对基类的封装性保留比较完好,而继承对基类的封装有一定程度的破坏,所以视情况决定使用组合还是继承,比如将一台电脑举例子,联想电脑与电脑是继承的关系,而联想电脑与鼠标是组合的关系。

多态:一个派生类调用同一个基类函数,通过对这个函数的重写达到不同派生类使用函数有不同效果的操作,

多态的条件1:在继承中使用引用或指针调用的虚函数2.被调用的函数是虚函数且必须重写过,,这个跟重定义很像,但是重定义不是虚函数,多态调用的重写函数至于指针或引用的对象有关,若不满足多态则调用的函数与类型有关,协变,重写的虚拟函数的返回值可能与基类的有所不同,但是他也构成多态,

析构函数与多态的关系:若一个基类的指针指向一个他的派生类,那么想要析构这个对象就得delete这个指针,但是若不用多态来delete这个指针,那么析构函数就对按类型来调用基类的析构函数,从而导致派生类有一部分内存泄漏,而利用多态让基类的指针调用派生类的析构函数,就能达到完美释放空间的效果。

重写函数都是对同名函数的重写,但是有时候疏忽大意写错函数名而编译器不会报错,就很麻烦,所以在对需要重写的函数加override修饰,若是没有重写编译器会自动警告,提醒没有重写函数,final关键字表示函数或类不能够被继承,

抽象类:包含虚函数等于零的类也叫纯虚函数叫抽象类,他不能够被继承,它的作用是强制让派生类完成重写

有一个比较奇怪的地方,就是用菱形继承虚继承以后,若这个继承体系中包含虚函数就会报错,显示虚函数的不明确继承。可能是由于最后的派生类虚继承了两个需要重写的虚函数,所以当屏蔽一个虚函数后程序可以运行,但是被屏蔽的多态不能使用,

 

标签:函数,继承,派生类,多态,基类,重写,14
From: https://www.cnblogs.com/qjwxlj/p/17320263.html

相关文章