经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
c++中的继承关系
来源:jb51  时间:2021/7/19 13:31:18  对本文有异议

1 什么是继承

继承概念

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。

  面向对象的继承关系指类之间的父子关系。用类图表示如下:

2 为什么要有继承?/ 继承的意义?

  因为继承是面向对象中代码复用的一种手段。通过继承,可以获取父类的所有功能,也可以在子类中重写父类已有的功能 以及 添加父类中没有的功能。

3如何理解 子类是特殊的父类?

  因为子类不仅继承了父类所有的属性与行为,而且在子类中还可以重写父类已有的功能,以及添加自己的新属性与新方法。这也就是说子类对象可以当作父类对象使用。

4 继承的规则

  1) 子类是特殊的父类

  2) 子类对象可以直接初始化父类对象

  3) 子类对象可以直接赋值给父类对象

5 继承中的访问级别

  1)public:在类的内部和外部都可以访问。

  2)protected::可以在类的内部使用,不可以在类的外部直接使用。,但是存在继承关系时,可以在子类中使用父类的protected的成员。

  3)private:只可以在类的内部使用,不可以在类的外部使用。

  注:类的内部:在当前类的作用域中(不包括子类的作用域);类的外部:类内部之外的作用域(包括子类的作用域)

  问题1:子类是否可以直接访问父类中的private成员(非公有成员)吗?(No)

    1)从面向对象理论的角度分析,可知子类拥有父类一切的属性与行为,得出的结论:Yes

    2)从c++的语法角度分析,可知外界不能访问类的private成员,得出的结论:No

  问题2:谈谈 protected关键字的存在的意义?

    protected关键字是为继承而存在的,这样就可以在子类中访问父类的protected成员,同时还不允许外界直接访问父类中的protected成员。

  问题3:在类中如何选择类的访问级别?--- 见下图

6 继承中的继承方式

  1)public 继承方式 --- 父类成员在子类中保持原有的访问级别。

  2)protected继承方式 ---父类中的公有成员在子类中变成了protected成员,其它不变。

  3)private 继承方式(默认) --- 父类成员在子类中变成了private成员

   可归纳为:

    结论:无论选择哪种继承方式,都不会影响子类访问父类成员的级别

  注:1) c++ 工程项目中只使用 public 继承方式;

    2) c++ 派生语言(jave,c#)只支持 public继承方式;

    3)protected、private 继承方式带来的复杂性远大于其实用性;(舍弃不用)

用代码实现类图中的功能:

  代码如下:

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. using namespace std;
  5. class Object
  6. {
  7. protected:
  8. string mName;
  9. string mInfo;
  10. public:
  11. Object()
  12. {
  13. mName = "Object";
  14. mInfo = "";
  15. }
  16. inline string getName()
  17. {
  18. return mName;
  19. }
  20. inline string getInfo()
  21. {
  22. return mInfo;
  23. }
  24. };
  25. class Point : public Object
  26. {
  27. private:
  28. int mX;
  29. int mY;
  30. public:
  31. Point(int x = 0, int y = 0)
  32. {
  33. ostringstream oss;
  34. mX = x;
  35. mY = y;
  36. mName = "Point";
  37. oss << "Point(" << mX << ", " << mY << ")";
  38. mInfo = oss.str();
  39. }
  40. inline int getX()
  41. {
  42. return mX;
  43. }
  44. inline int getY()
  45. {
  46. return mY;
  47. }
  48. };
  49. class Line : public Object
  50. {
  51. private:
  52. Point mP1;
  53. Point mP2;
  54. public:
  55. Line(Point p1, Point p2)
  56. {
  57. mP1 = p1;
  58. mP2 = p2;
  59. mName = "Line";
  60. mInfo = "Line from " + p1.getInfo() + " to " + p2.getInfo();
  61. }
  62. inline Point getStartPoint()
  63. {
  64. return mP1;
  65. }
  66. inline Point getEndPoint()
  67. {
  68. return mP2;
  69. }
  70. };
  71. int main(int argc, char const *argv[])
  72. {
  73. Object obj;
  74. cout << obj.getName() << endl;
  75. cout << obj.getInfo() << endl << endl;
  76. Point p1(1, 2);
  77. Point p2(3, 4);
  78. cout << p1.getName() << endl;
  79. cout << p1.getInfo() << endl;
  80. cout << p2.getName() << endl;
  81. cout << p2.getInfo() << endl << endl;
  82. Line line(p1, p2);
  83. cout << line.getName() << endl;
  84. cout << line.getInfo() << endl << endl;
  85. return 0;
  86. }

到此这篇关于c++中的继承关系的文章就介绍到这了,更多相关c++继承关系内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号