1 什么是继承

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

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
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 inline string getName()
19 {
20 return mName;
21 }
22 inline string getInfo()
23 {
24 return mInfo;
25 }
26 };
27
28 class Point : public Object
29 {
30 private:
31 int mX;
32 int mY;
33 public:
34 Point(int x = 0, int y = 0)
35 {
36 ostringstream oss;
37
38 mX = x;
39 mY = y;
40 mName = "Point";
41
42 oss << "Point(" << mX << ", " << mY << ")";
43 mInfo = oss.str();
44 }
45 inline int getX()
46 {
47 return mX;
48 }
49 inline int getY()
50 {
51 return mY;
52 }
53 };
54
55 class Line : public Object
56 {
57 private:
58 Point mP1;
59 Point mP2;
60 public:
61 Line(Point p1, Point p2)
62 {
63 mP1 = p1;
64 mP2 = p2;
65 mName = "Line";
66 mInfo = "Line from " + p1.getInfo() + " to " + p2.getInfo();
67 }
68 inline Point getStartPoint()
69 {
70 return mP1;
71 }
72 inline Point getEndPoint()
73 {
74 return mP2;
75 }
76 };
77
78 int main(int argc, char const *argv[])
79 {
80 Object obj;
81 cout << obj.getName() << endl;
82 cout << obj.getInfo() << endl << endl;
83
84 Point p1(1, 2);
85 Point p2(3, 4);
86 cout << p1.getName() << endl;
87 cout << p1.getInfo() << endl;
88 cout << p2.getName() << endl;
89 cout << p2.getInfo() << endl << endl;
90
91 Line line(p1, p2);
92 cout << line.getName() << endl;
93 cout << line.getInfo() << endl << endl;
94
95 return 0;
96 }

关于继承/组合的案例分析

c++中的继承关系的更多相关文章

  1. C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象

    C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象 讲解目录: 1.各类在内存中的表现形式   备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提.     2.子类继承父 ...

  2. 在Entity Framework 中实现继承关系映射到数据库表

    继承关系映射到数据库表中有多种方式: 第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表) 仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分 ...

  3. Style在Android中的继承关系

    Style在Android中的继承关系 Android的Styles(样式)和Themes(主题)非常类似Web开发里的CSS,方便开发者将页面内容和布局呈现分开.Style和Theme在Androi ...

  4. Dom中的继承关系

    首先声明,一些内容基于个人猜测,如果哪里有错误,请立即联系在下! 我们用js操作Dom时,会经常用到一些个方法比如基于获取到的元素选择其子元素: <!DOCTYPE html> <h ...

  5. 初步学习C++中的继承关系

    继承机制是面向对象程序设计使代码能够复用的最重要的手段,它同意程序猿在保持原有类特性的基础上进行扩展,添加功能. 这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂 ...

  6. android 中组件继承关系图,一目了然

    View继承关系图 Adapter适配器继承关系图 Activity继承关系图

  7. 浅谈javaScript中的继承关系<一>

    // JavaScript Document //创建三个构造函数 function Shape(){ this.name='ahape'; this.toString=function(){retu ...

  8. java中的继承关系

    1.定义 java中的继承是单一的,一个子类只能拥有一个父类:java中所有类的父类是java.lang.Object,除了这个类之外,每个类只能有一个父类: 而一个父类可以有多个子类,可以被多个子类 ...

  9. C++反汇编第三讲,反汇编中识别继承关系,父类,子类,成员对象

    讲解目录: 1.各类在内存中的表现形式   备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提.     2.子类继承父类 2.1 子类中有虚函数,父类中有虚函数 : 都有的情况下   ...

随机推荐

  1. 使用 JavaScript 将 HTML 转换为 PDF

    使用 JavaScript 将 HTML 转换为 PDF 更多相关学习资料参见http://www.pdfdownload.cn/b/ba_index.php 在本文中,我们将了解如何在浏览器(即完全 ...

  2. Go基础结构与类型05---程序运算

    package main import ( "fmt" "math" ) func main() { /*加减乘除,求余*/ fmt.Println(" ...

  3. 人脸真伪验证与识别:ICCV2019论文解析

    人脸真伪验证与识别:ICCV2019论文解析 Face Forensics++: Learning to Detect Manipulated Facial Images 论文链接: http://o ...

  4. TensorRT-优化-原理

    TensorRT-优化-原理 一.优化方式 TentsorRT 优化方式: TensorRT优化方法主要有以下几种方式,最主要的是前面两种. 层间融合或张量融合(Layer & Tensor ...

  5. 用Auto-TensorCore代码生成优化matmul

    用Auto-TensorCore代码生成优化matmul 将演示如何使用TVM Auto TensorCore CodeGen在Volta/Turing GPU上编写高性能matmul调度.这是一个透 ...

  6. CAP 超详细名词解释

    目录 引言 概述 分布式 一致性 ACID中的一致性 可用性 分区容错性 可用性与分区容错性,傻傻分不清 问题1:分区容错性说分区故障正常工作,什么叫正常工作?这个正常工作是指满足可用性吗? 问题2: ...

  7. mybatis——解决属性名和数据库字段名不一致问题

    首先说一下,我的数据库名字叫mybatis,里边有一张user表,表中有三个字段,id.name.pwd:然后实体类中对应三个属性id.name.password(id和name跟数据库字段名一致,但 ...

  8. ThreadLocal源码阅读笔记

    功能描述 ThreadLocal解决了访问共享变量的阻塞问题,并且不需要像CAS操作一样牺牲CPU资源,它为每一个线程维护了一个变量副本,每个线程在访问ThrealLocal里面的变量时实际上访问的是 ...

  9. 2、java基础语法(上):变量与运算符

    关键字与保留字 关键字 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词) 特点:关键字中所有字母都为小写 官方地址:https://docs.oracle.com/javase/tut ...

  10. 【NX二次开发】Block UI 半径尺寸(沿曲线的位置)

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...