在C++里,通过继承和组合实现了代码复用,使得开发效率提高,并且能够通过代码看到事物的关系

组合比继承简单,所以在写代码时先考虑能否组合,再来考虑继承.


组合的特点

  • 其它类的对象作为当前类的成员使用

比如主机类,拥有 CPU/主板/内存/硬盘这4个对象成员,而这4个对象成员并没有继承主机类的特性和行为

继承的特点

  • 新的类(子类)具有旧的类(父类)的属性和行为
  • 旧的类被称为父类,也叫基类
  • 新的类被称为子类,也叫派生类(一个派生类也可以继承多个基类)
  • 子类可以添加新的属性和行为(成员变量和成员函数),也可以重写已有的属性和行为
  • 一个子类只继承一个父类,便被称为单继承
  • 一个子类若继承多个父类,便被称为多继承
  • 子类其实就是一个特殊的父类,比如:苹果手机是手机,就是将苹果手机当做一个特殊的父类对待

子类对象可以初始化父类对象,也可以赋值给父类对象,比如:

  1. class Parent
  2. {
  3. int mValue;
  4. public:
  5. Parent()
  6. {
  7. mValue=;
  8. }
  9. int Value()
  10. {
  11. return mValue;
  12. }
  13. };
  14.  
  15. class Child : public Parent
  16. {
  17. public:
  18. Child()
  19. {
  20. cout<<"I'm child"<<endl;
  21. }
  22. };
  23.  
  24. int main()
  25. {
  26. Child c;
  27. cout<< c.Value() <<endl; //调用父类的成员函数
  28.  
  29. Parent p1 =c;    //通过子类初始化父类
  30.  
  31. Parent p2;
  32.  
  33. p2=c; //通过子类复制给父类
  34. }

类的访问级别之protected

大家都知道,类里private修饰的成员和函数,不能被外界直接访问.

虽然子类拥有父类的属性和行为,但是在子类里,也不能访问父类的private私有成员

比如:

  1. class Parent
  2. {
  3. int mValue;
  4. public:
  5. Parent(int i=)
  6. {
  7. mValue=i;
  8. }
  9. int Value()
  10. {
  11. return mValue;
  12. }
  13. };
  14.  
  15. class Child : public Parent
  16. {
  17. public:
  18. Child()
  19. {
  20. cout<<mValue<<endl; //在子类中,访问父类的private成员,将会编译报错
  21. }
  22. };

所以类的访问级别引入了新的关键字protected

protected的特性

  • 修饰的成员不能被外界直接访问
  • 修饰的成员可以被子类(包括子类的子类)直接访问, 也可以在本类内部直接访问

有了protected的加入,定义类时,我们就需要仔细考虑成员的访问级别,如下图所示:

接下来做个综合实例,组合与继承

  • 需要一个父类Object, 为子类Point子类Line 提供name名字和info信息
  • 由于线Line至少需要两个点Point才能组成,所以Line子类内部需要通过Point子类来组合

如下图所示:

开始写代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4.  
  5. using namespace std;
  6.  
  7. class Object
  8. {
  9. protected:
  10. string mName;
  11. string mInfo;
  12. public:
  13. Object()
  14. {
  15. mName="Object";
  16. mInfo="";
  17. }
  18. string name()
  19. {
  20. return mName;
  21. }
  22. string info()
  23. {
  24. return mInfo;
  25. }
  26. };
  27.  
  28. class Point : public Object
  29. {
  30. protected:
  31. int x; //坐标
  32. int y;
  33.  
  34. public:
  35. Point(int x=,int y=)
  36. {
  37. ostringstream s;
  38. this->x =x;
  39. this->y =y;
  40. s<<"P("<<x<<","<<y<<")"; //坐标信息
  41. mName="Point";
  42. mInfo=s.str();
  43. }
  44. };
  45.  
  46. class Line : public Object
  47. {
  48. private:
  49. Point mP1;
  50. Point mP2;
  51. public:
  52. Line(Point p1,Point p2)
  53. {
  54. ostringstream s;
  55. mP1 =p1;
  56. mP2 =p2;
  57. s<<"Line from " <<p1.info() <<" to "<<p2.info(); //线的信息
  58. mName ="Line";
  59. mInfo =s.str();
  60. }
  61. };
  62.  
  63. int main()
  64. {
  65. Point p1(,);
  66. Point p2(,);
  67. Line L(p1,p2);
  68. /*打印点的信息*/
  69. cout<<p1.name()<<":"<<endl;
  70. cout<<p1.info()<<endl;
  71.  
  72. /*打印线的信息*/
  73. cout<<L.name()<<":"<<endl;
  74. cout<<L.info()<<endl;
  75. return ;
  76. }

运行打印:

  1. Point:
  2. P(,)
  3.  
  4. Line:
  5. Line from P(,) to P(,)

接下来来学习: 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、虚函数

22.C++- 继承与组合,protected访问级别的更多相关文章

  1. C++中继承的protected访问级别

    1,子类是否可以直接访问父类的私有成员? 2,根据面向对象理论: 根据 C++ 语法: 3,继承中的访问级别编程实验: #include <iostream> #include <s ...

  2. Java继承与组合

    Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...

  3. [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

    目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...

  4. Java中的继承与组合

    本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...

  5. Python面向对象的三大特性之继承和组合

    继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...

  6. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  7. java 中继承,组合,重载,重写的实现原理 (转)

    我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...

  8. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  9. Java中的继承与组合(转载)

    本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...

随机推荐

  1. sspanelv3魔改版邮件设置指南及常用配置

    要进行SSpanel v3魔改版邮件设置,需要在设置文件(位于config/.config.php下)中修改两处内容: 1.设置发送邮件的方式 $System_Config['enable_email ...

  2. 论文笔记(5):Fully Convolutional Multi-Class Multiple Instance Learning

    这篇论文主要介绍了如何使用图片级标注对像素级分割任务进行训练.想法很简单却达到了比较好的效果.文中所提到的loss比较有启发性. 大体思路: 首先同FCN一样,这个网络只有8层(5层VGG,3层全卷积 ...

  3. 小程序wx.navigateTo和wx.redirectTo 都无效

    最近在写小程序,遇到页面跳转时,发现有几次失败.查询资料已解决,总结一下知识点: 一.如下,第5层到到6层时失败(评论页⑤-->返回商品详情页⑥) 登陆①-->主页②-->商品列表页 ...

  4. Java学习者的建议:把自己从一个疯狂下载者&资料的奴隶变成一个真正的学习者

    Java学习者的建议:把自己从一个疯狂下载者&资料的奴隶变成一个真正的学习者 你下载的资料看过了多少,请大家好好想想,然后回答一下很多人为了The.Economist花了不少时间,为了下载一个 ...

  5. VS快速注释

    注释:Ctrl+k  + Ctrl+c 去注释:Ctrl+k + Ctrl +u

  6. gnuplot画图中文标注相关问题

    gnuplot是一个基于命令行的开源跨平台画图工具包,画图功能非常丰富.不过最近在考虑如何在gnuplot图中添加中文标注的过程中遇到了一些问题,记录如下. gnuplot支持多种的输出格式,比如pn ...

  7. vue中$on与$emit的实际应用

    $on常用于监听自定义事件,触发后可传入参数 //监听event1事件 vm.$on('event1',function(msg){ console.log(msg) }) //触发event1自定义 ...

  8. json字符串对象内嵌json对象

    有时候需要在json的key:value字符串对象中再嵌入一个json对象,如果需要把如下的json对象作为字符串嵌入到json字符串对象中: { "type": 2, " ...

  9. Mycat 分片规则详解--取模范围分片

    实现方式:该算法先进行取模,然后根据取模值所属范围进行分片 优点:可以自主决定取模后数据的节点分布 缺点:dataNode 划分节点是事先建好的,需要扩展时比较麻烦. 配置示例: <tableR ...

  10. 笔记:MyBatis XML配置详解

    MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties ...