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

免费织梦导航网站模板下载地址自己建站网站

免费织梦导航网站模板下载地址,自己建站网站,如何进入官方网站,北京的软件公司集中在哪个区【C进阶】继承 #x1f955;个人主页#xff1a;开敲#x1f349; #x1f525;所属专栏#xff1a;C#x1f96d; #x1f33c;文章目录#x1f33c; 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3 继承类模…【C进阶】继承 个人主页开敲 所属专栏C 文章目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承父类成员访问方式的变化 1.3 继承类模板 2. 父类和子类对象赋值兼容转换 3. 继承中的作用域 3.1 隐藏规则 4. 子类的默认成员函数 4.1 4个常见默认成员函数 4.2 实现一个无法被继承的类 5. 继承与友元 6. 继承与静态成员 7. 多继承及灵性继承问题 7.1 继承模型 7.2 虚继承 7.3 多继承中的指针偏移问题 8. 继承和组合 8.1 继承和组合 1. 继承的概念及定义 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段它允许我们在保持原有类特性的基础上进行扩展增加方法(成员函数)和属性(成员变量)这样产生新的类称子类。继承呈现了面向对象程序设计的层次结构体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用继承是类设计层次的复用。 下⾯我们看到没有继承之前我们设计了两个类Student和TeacherStudent和Teacher都有姓名/地址/电话/年龄等成员变量都有identity⾝份认证的成员函数设计到两个类里面就是冗余的。当然他们也有⼀些不同的成员变量和函数比如老师独有成员变量是职称学⽣的独有成员变量是学号学⽣的独有成员函数是学习老师的独有成员函数是授课。 class Teacher { public:     void identity()     {         //身份认证     } private:     size_t _age;//年龄     string _name;//姓名     string _address;//地址     string _tel;//电话     string _title;//学号 }; class Student { private:     size_t _age;//年龄     string _name;//姓名     string _address;//地址     string _tel;//电话     string _stuid;//职称 }; 下面我们公共的成员都放到Person类中Student和teacher都继承Person就可以复用这些成员就不需要重复定义了省去了很多麻烦。 class Person { public: public:     void identity()     {         //身份认证     }     size_t _age;//年龄     string _name;//姓名     string _address;//地址     string _tel;//电话 }; class Teacher:public Person { private:     string _title;//学号 }; class Student:public Person { private:     string _stuid;//职称 }; 1.2 继承定义 1.2.1 定义格式 从上面我们看到Person是父类也可以称为基类Student和Teacher是子类也可以称为派生类。继承方式如下图: 可以看到这里的继承方式所用的关键字和我们访问限定符的关键字是一样的 1.2.2 继承父类成员访问方式的变化 总结如下 子类中的父类成员的访问方式取决于 父类对这些成员的访问限定符与继承方式 中权限较小的。 比如父类的成员用private限定继承方式用public那么实际上父类中的成员继承到子类中后也是private因此子类虽然继承了父类的成员但是不可访问。 1.3 继承类模板 这里我们实现一个栈的类继承的是库中的vector因此我们在实现栈的功能尾插、尾删、获取栈顶元素等操作时就可以调用vector中的函数。 2. 父类和子类对象赋值兼容转换 ① public继承的子类对象可以赋值给父类的对象/父类的指针/父类的引用。这里有个形象的说法叫切片或者切割。寓意把子类中父类那部分切来赋值过去。 ② 父类对象不能赋值给子类对象。 3. 继承中的作用域 3.1 隐藏规则 ① 在继承体系中父类和子类都有独立的作用域。 ② 子类和父类中有同名成员子类中将会屏蔽对父类中的同名成员的直接访问这种情况叫隐藏。如果想要访问父类中的同名成员使用 父类 :: 同名成员  即可访问。 ③ 子类和父类中的成员函数只要函数名相同就构成隐藏不受其他因素限制。 ④ 因此在继承体系中不建议定义同名函数。 4. 子类的默认成员函数 4.1 4个常见默认成员函数 默认成员函数是指我们不写编译器会帮我们自动生成常见的4个默认成员函数有构造函数、析构函数、拷贝构造函数、operator。那么在子类中这4个默认成员函数是如何生成的呢 ① 子类的构造函数必须调用父类的构造函数初始化父类的那⼀部分成员。如果父类没有默认的构造函数则必须在子类构造函数的初始化列表阶段显示调用。 ② 子类的析构函数会在被调用完成后自动调用父类的析构函数清理父类成员。因为这样才能保证子类对象先清理子类成员再清理父类成员的顺序。 ③ 子类对象初始化时先调用父类对象的构造函数再调用子类对象的构造函数。 ④ 子类的拷贝构造函数必须调用父类的拷贝构造完成父类的拷贝初始化。 ⑤ 子类的operator必须要调用父类的operator完成父类的复制。需要注意的是子类的operator隐藏了父类的operator所以显示调用父类的operator需要指定父类作用域。 4.2 实现一个无法被继承的类 方法1将父类的构造函数设为private因为在构造子类对象时必须要调用父类对象的构造函数而父类对象的构造函数设为私有无法访问因此也就无法被继承。 方法2使用final修饰父类就不能够被继承了。finale有最后的意思这里可以理解为最终类。 5. 继承与友元 友元关系不能继承也就是说父类友元不能访问子类私有和保护成员。 6. 继承与静态成员 父类定义了static静态成员则整个继承体系里面只有⼀个这样的成员。无论派生出多少个子类都只有⼀个static成员实例。 7. 多继承及灵性继承问题 7.1 继承模型 单继承一个子类只有一个父类的情况我们称为单继承。 多继承一个子类有两个或者两个以上的父类时称为多继承多继承对象在内存中存储的方式为先继承的父类在最前面后面继承的父类按照顺序排列子类的成员排在最后。 菱形继承菱形继承是多继承的一种特殊情况。 从上面可以看出fun2和fun3都继承了fun1都存有了一份size_t _fun1而fun0继承了fun2和fun3因此不可避免地fun0中存有了两份fun1中的size_t _fun1这就会导致数据冗余和⼆义性。支持多继承就一定会存在菱形继承的问题实践中使用多继承是务必要小心谨慎。 这里在访问_fun1时系统报错说fun0::_fun1不明确也就是这里的两份_fun1系统也不知道你要访问的是哪一份。这就是二义性问题。 7.2 虚继承 那我们在实践中不可避免地要写出菱形继承但是又想避免数据冗余和⼆义性的问题该如何做呢这里就需要使用到virtual关键字 7.3 多继承中的指针偏移问题 来看一道例题 关于多继承中指针偏移问题下面选项正确的是()       A. f1f2f3      B. f1f2f3      C. f1f3!f2      D. f1!f2!f3 代码 class fun1 { public:     size_t _fun1; }; class fun2 { public:     size_t _fun2; }; class fun3 :public fun1, public fun2 { private:     size_t _fun3; }; int main() {     fun3 f3;     fun1* f1 f3;     fun2* f2 f3;     return 0; } 正确答案C 为什么呢一张图弄明白 8. 继承和组合 8.1 继承和组合 ① 继承是一种is-a的关系。意思就是每个子类对象都是一个父类对象就好比是有血缘关系的父子儿子有自己不同于父亲之处同时也一定有与父亲的相同之处相同之处便是子类继承父类的那一部分。 ② 继承允许你根据父类的实现来定义子类的实现。这种通过生成子类的复用通常被称为白箱复用 (white-box reuse)。术语“白箱”是相对可视性而言在继承方式中父类的内部细节对子类可见 。继承⼀定程度破坏了父类的封装父类的改变对子类有很大的影响。子类和父类间的依赖关系 很强耦合度高。 ③ 组合是一种has-a的关系。可以理解为数学中的集合{1,2,3}和{1,2,3,4,5,6}的关系前者是后者的子集后者包含前者。 ④ 对象组合是类继承之外的另⼀种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse)因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关系耦合度低。优先使用对象组合有助于你保持每个类被封装。 ⑤ 优先使用组合而不是继承。实际尽量多去用组合组合的耦合度低代码维护性好。不过也不太那么绝对类之间的关系就适合继承(is-a)那就用继承另外要实现多态也必须要继承。类之间的关系既适合用继承(is-a)也适合组合(has-a)那就用组合。 ⑥ 很多人说C语法复杂其实多继承就是⼀个体现。有了多继承就存在菱形继承有了菱形继承就有菱形虚拟继承底层实现就很复杂并不像我们想的那么简单性能也会有⼀些损失所以最好不要设计出菱形继承。多继承可以认为是C的缺陷之一后来的⼀些编程语⾔都没有多继承如Java。 创作不易点个赞呗蟹蟹啦~
http://www.w-s-a.com/news/620795/

相关文章:

  • 获取网站访客qq号码代码做抽奖网站违法吗
  • 湖南大型网站建设公司排名偷网站源码直接建站
  • 网站建设周期规划北京网站设计必看刻
  • 如何做自己的在线作品网站深圳网站设计公司的
  • 网站开发外包公司wordpress最简单模板
  • 湖南省建设人力资源网站wordpress主机pfthost
  • 淮安软件园哪家做网站各网站特点
  • 网站长尾关键词排名软件重庆荣昌网站建设
  • 建个商城网站多少钱茂名专业网站建设
  • 开通公司网站免费的网站app下载
  • 跨境电商网站模板wordpress壁纸
  • 国内做网站网站代理电子商务网站建设与维护概述
  • 如何做地方网站推广沈阳网势科技有限公司
  • 哈尔滨网站优化技术涵江网站建设
  • 做网站搞笑口号wordpress全屏动画
  • 怎么可以建网站小程序代理项目
  • 怎样做软件网站哪个网站用帝国cms做的
  • 网站开发编程的工作方法wordpress dux-plus
  • 廊坊电子商务网站建设公司网站进不去qq空间
  • 南宁网站推广费用创意网页设计素材模板
  • 深圳技术支持 骏域网站建设wordpress 酒主题
  • 东莞网站建设+旅游网站改版数据来源表改怎么做
  • 手机端做的优秀的网站设计企业做网站大概多少钱
  • 优化网站使用体验手机网站解析域名
  • 网站制作 商务做网站的软件名字全拼
  • 阿里巴巴网官方网站温州网站建设设计
  • 传奇购买域名做网站国外网站设计 网址
  • 西安凤城二路网站建设seo网站是什么
  • 网站后台如何更换在线qq咨询代码在线种子资源网
  • 东莞网站优化制作免费中文wordpress主题下载