当前位置:首页 » 《关注互联网》 » 正文

【C++】:继承[下篇](友元&&静态成员&&菱形继承&&菱形虚拟继承)

3 人参与  2024年10月30日 09:20  分类 : 《关注互联网》  评论

点击全文阅读


目录

一,继承与友元二,继承与静态成员三,复杂的菱形继承及菱形虚拟继承四,继承的总结和反思
点击跳转上一篇文章: 【C++】:继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数)

一,继承与友元

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

二,继承与静态成员

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例 。

class Person{public:Person() { ++_count; }protected:string _name; // 姓名public:static int _count; // 统计人的个数。};int Person::_count = 0;class Student : public Person{protected:int _stuNum; // 学号};int main(){Person p;Student s;cout << &Person::_count << endl;cout << &Student::_count << endl;return 0;}

在上述代码中,此时Student和Person里面的_count是同一个,静态变量_count存在静态区,不是单独的存在各个对象里,是属于整个继承体系了

三,复杂的菱形继承及菱形虚拟继承

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

在这里插入图片描述

2.多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。

在这里插入图片描述
3.菱形继承:菱形继承是多继承的一种特殊情况。

在这里插入图片描述

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。

class Person{public:string _name; // 姓名int _id;int _tel;string _adress;};class Student : public Person{protected:int _num; //学号};class Teacher : public Person{protected:int _id; // 职工编号};class Assistant : public Student, public Teacher{protected:string _majorCourse; // 主修课程};int main(){//数据冗余和二义性Assistant a;//a._name = "小李";//a._name = "李老师";//1.指定类域a.Student::_name = "小李";a.Teacher::_name = "李老师";}

由监视窗口得出数据的冗余:
在Assistant的对象中Person成员会有两份

在这里插入图片描述

并且在访问成员变量时指定不明确,有二义性

在这里插入图片描述

4.解决方法

4.1 访问成员变量有二义性时,可指定类域

int main(){//继承代码续接上……//1.指定类域a.Student::_name = "小李";a.Teacher::_name = "李老师";}

在这里插入图片描述

4.2 虚拟继承可以解决菱形继承的二义性和数据冗余的问题

虚拟继承:在继承会造成冗余的类的那里加上关键字 virtual

class Person{public:string _name; // 姓名int _id;int _tel;string _adress;};class Student : virtual public Person{protected:int _num; //学号};class Teacher : virtual public Person{protected:int _id; // 职工编号};class Assistant : public Student, public Teacher{protected:string _majorCourse; // 主修课程};int main(){Assistant a;a.Student::_name = "小李";a._name = "小李";a._name = "李老师";return 0;}

四,继承的总结和反思

1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。

2.多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。

3.继承和组合

(1) public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。

(2) 组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。

(3) 优先使用对象组合,而不是类继承

(4) 继承可以直接访问基类的protected 和 public成员。在继承方式中,基类的,内部细节对子类可见 。继承一定程度破坏了基类的封装,类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高

(5) 组合只能访问public成员组合类之间没有很强的依赖关系,耦合度低。优先使用对象组合有助于你保持每个类被封装。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/179812.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 林语熙周晏京(离婚后,老公天天跪求复合全集阅读)最新章节免费在线阅读_《离婚后,老公天天跪求复合全集阅读》最新热门小说 -
  • 顾绫雪嬴政《被始皇读心后,文武百官卷疯了!完结版阅读》完整版免费在线阅读_(顾绫雪嬴政)全集免费阅读 -
  • 情深意长皆成空完整版阅读(沈卿林砚辞)抖音热文_《情深意长皆成空完整版阅读》最新章节免费在线阅读 -
  • 姐姐为暴富重伤傅家金孙后火葬场了全集阅读小说(傅延江瑶)全文免费阅读无弹窗大结局_(姐姐为暴富重伤傅家金孙后火葬场了全集阅读免费阅读全文大结局)最新章节列表_笔趣阁(姐姐为暴富重伤傅家金孙后火葬场了全集阅读) -
  • 乔以诺萧瑾淮(不是你好是我好全集阅读)精彩试读_《不是你好是我好全集阅读》全本阅读 -
  • 白月光双双《重生后我成全老公和白月光,他却急了全集》全文免费阅读无弹窗大结局_(白月光双双)最新章节免费在线阅读 -
  • 苏小枫苏末小说免费笔趣阁_苏小枫苏末小说全章完本大结局
  • 死遁后他疯了最新小说全文阅读_最新免费小说沈轻洲林梦江之雪_完本小说(死遁后他疯了)
  • 免费小说《顾里宋婷婷小岳欧颖倩》已完结(顾里宋婷婷小岳欧颖倩)热门小说大结局全文阅读笔趣阁
  • 侄子为求富贵,变性后全家后悔最新小说_免费小说全文阅读(苏小枫苏末)_侄子为求富贵,变性后全家后悔苏小枫苏末小说推荐完结
  • 最新《沈轻洲林梦江之雪》小说(全集完整新上小说大结局(沈轻洲林梦江之雪))全文阅读笔趣阁
  • 拒绝嫁给姐夫后,我在八零年代暴富了(陈小棠沈正韩)阅读 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1