当前位置: 首页 > news >正文

网站友链外链江苏苏州网站建设

网站友链外链,江苏苏州网站建设,找人代做网站费用,凡科模板前言 从继承开始就开始C进阶了#xff0c; 这一块需要好好学习#xff0c;这块知识很重要#xff0c; 坑有点多#xff0c;所以是面试笔试的常客。 基本概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段#xff0c; 它允许程序员在保持原有…前言 从继承开始就开始C进阶了 这一块需要好好学习这块知识很重要 坑有点多所以是面试笔试的常客。 基本概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段 它允许程序员在保持原有类特性的基础上进行扩展增加功能 这样产生新的类称派生类。继承呈现了面向对象程序设计的层次结构 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用 继承是类设计层次的复用。 举例 学校的老师和同学 他们具有一些相同的属性 比如年龄姓名性别等等同时 也具备一些不同的属性 如学生的学号老师的工号等等 这样我们就可以把相同的属性提取出来 写到一个类中去而老师学生的专属信息则写到自己的类中 然后将相同的属性继承过来。 师生共同信息 struct Person {string name;string sex;int age; } 学生专属信息 class Student : public Person { protected:int _stuid; // 学号 }; 老师专属信息 class Teacher : public Person { protected:int _jobid; // 工号 }; 我们通常把被继承的类叫做基类/父类 把继承类的类叫做子类/派生类 继承关系和访问限定符 继承方式和访问限定符各有三种 继承的方式不同,那么子类中继承 到的父类的变量的访问权限就不同 大概有几点 父类的private成员在子类是不可见的! (继承下来了但不能使用)不使用继承protected与private没有区别使用继承private类内访问可以访问类外访问不可以访问子类访问不可以访问。protected类内访问可以访问类外访问不可以访问子类访问可以访问。public类内访问可以访问类外访问可以访问子类访问可以访问。使用时一般使用public使用关键字class时默认的继承方式是private 使用struct时默认的继承方式是public 继承中的作用域 1. 在继承体系中基类和派生类都有独立的作用域。 2. 子类和父类中有同名成员子类成员将屏蔽父类对同名成员的直接访问 这种情况叫隐藏也叫重定义。在子类成员函数中可以使用 基类::基类成员 显示访问 3. 需要注意的是如果是成员函数的隐藏只需要函数名相同就构成隐藏。 4. 注意在实际中在继承体系里面最好不要定义同名的成员 在main函数中定义student对象 后再打印_num默认为子类中的_num 若想打印父类中的_num,需要指定类域 但是函数名相同的话 不应该是构成函数重载吗?是的,在同一 作用域下,函数名相同确实构成函数重载但是父子类是不同作用域,这里是构成隐藏! 父子类赋值兼容规则 子类对象可以赋值给父类对象基类的对象 / 基类的指针 / 基类的引用切片 父类对象不能直接赋值给子类对象 注意这里能够赋值不是隐式类型转换! 子类的默认成员函数 我们知道类的六个默认成员函数 不显示写系统会自动生成的 子类的默认成员函数有哪些特殊的行为? 1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。 如果基类没有默认的构造函数 则必须在派生类构造函数的初始化列表阶段显示调用。2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。3. 派生类的operator必须要调用基类的operator完成基类的复制。4. 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。 因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。5. 派生类对象初始化先调用基类构造再调派生类构造。6. 派生类对象析构清理先调用派生类析构再调基类的析构。7. 因为后续一些场景析构函数需要构成重写 重写的条件之一是函数名相同那么编译器会对析构函数名进行特殊处理 处理成destrutor()所以父类析构函数不加virtual的情况下 子类析构函数和父类析构函数构成隐藏关系。 继承与友元,继承与静态变量 继承与友元 友元关系不能继承也就是说基类友元不能访问子类私有和保护成员 继承于静态变量 基类中定义的静态成员被整个继承体系共享整个继承体系里面只有一个这样的成员 无论派生出多少个子类 都只有一个static成员实例 菱形继承和虚拟继承 菱形继承是一个大坑为了解决这个大坑祖师爷掉了不少头发 先看一下单继承、多继承、菱形继承的形式 单继承 多继承 菱形继承 类B继承了类A,类C也继承了类A然而类D继承了类B和C 此时会有一个问题,类D的实例化对象中 有类B和类C,然而B类和C类都有A类 所以说D类对象中的A类成员就重复了! class A {int _a 1; }; class B :public A {int _b 2; }; class C :public A {int _c 3; }; class D :public B, A {int _d 4; };D对象中有两个_a,一个在B类一个在C类 这就造成了数据冗余, 使用域访问限定符可以勉强解决二义性但是解决不了数据冗余 但是可以使用虚拟继承 来解决这一问题: 虚拟继承:在继承前加上virtual关键字 class A {int _a 1; }; class B :virtual public A {int _b 2; }; class C :virtual public A {int _c 3; }; class D :public B, A {int _d 4; };虚拟继承可以解决菱形继承的二义性和数据冗余的问题。虚拟继承不要在其他地方去使用 注意,只用腰部的类加上virtual即可少用! 虚拟继承原理 下图是菱形继承的内存对象成员模型这里可以看到数据冗余 下图是菱形虚拟继承的内存对象成员模型这里可以分析出D对象中将A放到的了对象组成的最下 面这个A同时属于B和C那么B和C如何去找到公共的A呢这里是通过了B和C的两个指针指 向的一张表。这两个指针叫虚基表指针这两个表叫虚基表。虚基表中存的偏移量。通过偏移量 可以找到下面的A。 可以看到BC里面多存一个地址不再是存储a的值了 这个地址用来指向右边的表表里面第一个值暂且不管不是目前的内容 第二个值则表示偏移量 例B里面3上面然后通过地址找到偏移量例B14然后地址加偏移量找到a 也就是继承的是同一份a 当然如果只看当前问题这个位置直接存偏移量或者地址是没有问题的 但是如果有多个子类呢明显还是这种方法更佳 下面是上面的Person关系菱形虚拟继承的原理解释 继承和组合 public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。 组合是一种has-a的关系。假设B组合了A每个B对象中都有一个A对象。 1.继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称 为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言在继承方式中基类的 内部细节对子类可见 。继承一定程度破坏了基类的封装基类的改变对派生类有很 大的影响。派生类和基类间的依赖关系很强耦合度高。 2.对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象 来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复 用(black-box reuse)因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。 组合类之间没有很强的依赖关系耦合度低。优先使用对象组合有助于你保持每个类被 封装。 3.实际尽量多去用组合。组合的耦合度低代码维护性好。不过继承也有用武之地的有 些关系就适合继承那就用继承另外要实现多态也必须要继承。类之间的关系可以用 继承可以用组合就用组合。 住优先使用对象组合而不是类继承 。 // Car和BMW Car和Benz构成is-a的关系class Car{protected:string _colour 白色; // 颜色string _num 陕ABIT00; // 车牌号};class BMW : public Car{public:void Drive() {cout 好开-操控 endl;}};class Benz : public Car{public:void Drive() {cout 好坐-舒适 endl;}};// Tire和Car构成has-a的关系class Tire{protected:string _brand Michelin;  // 品牌size_t _size 17;     // 尺寸};class Car{protected:string _colour 白色; // 颜色string _num 陕ABIT00; // 车牌号Tire _t; // 轮胎}; 总结 继承是多态的基础,而笔试面试的时候继承和多态是考察的很多的, 同时这里也有很多坑,稍不注意就会掉进去, 这块知识的学习一定要仔细认真。
http://www.w-s-a.com/news/455522/

相关文章:

  • 男女做羞羞的事情网站30岁转行做网站编辑
  • 做企业网站的轻量级cmswordpress 越来越慢
  • 无锡中英文网站建设莱芜网络公司
  • ps软件下载官方网站相关搜索优化软件
  • 世界杯网站源码下载做网站推广代理
  • 用股票代码做网站的wordpress通过标签调用文章
  • iis添加网站ip地址树莓派运行wordpress
  • 网站空间域名多少钱宿迁做网站公司
  • 福州建设企业网站网站交互主要做什么的
  • 英文网站建设方法门户网站特点
  • 腾讯云备案 网站名称萧山城市建设网站
  • 漳浦网站建设网络营销推广策略
  • 龙岗商城网站建设教程百度关键词排名突然没了
  • 深圳网站建设服务哪家有织梦网站模板安装
  • 网站设计与网页制作代码大全网站开发还找到工作吗
  • 给设计网站做图会字体侵权吗站长工具seo综合查询张家界新娘
  • 网站的建设与颜色搭配win7在iis中新建一个网站
  • 单位做网站有哪些功能型类的网站
  • 网站怎样做优惠卷移动互联网开发培训
  • 重庆网站建设帝维科技网站做定向的作用
  • 网站建设工作室wp主题模板做污事网站
  • 网站建设 深圳 凡科重庆家居网站制作公司
  • 自己也可以免费轻松创建一个网站企业收录网站有什么用
  • 帮别人做网站违法导航网站开发工具
  • seo网站外包公司字画价格网站建设方案
  • 网站国内空间价格销售技巧
  • 广安建设企业网站qq互联网站备案号
  • 京东网站建设的要求vs2010做的网站
  • wordpress 新闻杂志主题佛山企业网站排名优化
  • 选服务好的网站建设金华市开发区人才网