1,继承在面向对象中具有举足轻重的地位,面向对象当中的很多高级技术都和继承是息息相关的,比如面向对象的高端课程《设计模式》中的每一种技术都和继承有关,因此我们非常有必要在学习 C++ 时,把继承好好的掌握;通过生活中的例子,来入手面向对象中的概念,绝对是一个很好的选择,因为面向对象理   论起源于生活;

2,生活中的继承是一种关系,发生在两个实体之间,最直接的例子是儿子继承了父亲的一切东西,包括长相、性格,龙生龙指的是特征的继承,这说明了日常生活中继承包含的第一个层面的意思就是特征上面的获取,老鼠儿子会打洞指的是行为的继承,这说明了日常生活中继承包含的第二个层面的意思就是行为上面的获取;综上所述,生活中的继承指的是特征和行为的获取;

3,面向对象中的继承类推生活中的继承也应该是一种关系;

4,思考:

1,类之间是否存在直接的关联关系?

1,面向对象中的实体只有类和对象,对象是用类来创建的,所以我们有必要考虑类之间是否有关联关系,如果类之间没有关联关系,则类的继承无从谈起;

5,组合关系:整体与部分的关系:

6,组合关系的描述实例分析:

 1,代码示例:

 #include <iostream>
#include <string> using namespace std; class Memory
{
public:
Memory()
{
cout << "Memory()" << endl;
}
~Memory()
{
cout << "~Memory()" << endl;
}
}; class Disk
{
public:
Disk()
{
cout << "Disk()" << endl;
}
~Disk()
{
cout << "~Disk()" << endl;
}
}; class CPU
{
public:
CPU()
{
cout << "CPU()" << endl;
}
~CPU()
{
cout << "~CPU()" << endl;
}
}; class MainBoard
{
public:
MainBoard()
{
cout << "MainBoard()" << endl;
}
~MainBoard()
{
cout << "~MainBoard()" << endl;
}
}; class Computer // 这个地方不仅描述了事物,也还描述了关系,里面只要有一个类不存在,电脑这个类也就不复存在了;
{
Memory mMem;
Disk mDisk;
CPU mCPU;
MainBoard mMainBoard;
public:
Computer() // 这里会先调用类成员的构造函数,之后调用电脑类的构造函数,这说明了组合关系;电脑类对象的创建,要依赖上述四个类的对象的创建;
{
cout << "Computer()" << endl;
}
void power()
{
cout << "power()" << endl;
}
void reset()
{
cout << "reset()" << endl;
}
~Computer() // 电脑类析构的时候,也会将对应的类成员析构,这说明同生死;说明了电脑类对象的存在完全依赖于类成员对象的存在;
{
cout << "~Computer()" << endl;
}
}; int main()
{
Computer c; return ;
}

  1,这里各个类没有实现具体的功能,但是这里主要是用类描述了一种生活当中     整体和部分的关系;

  2,面向对象的强大主要在于它直接的描述生活里面的例子,不需要建模了,生活当中什么样子,程序就是什么样子,这样很容易帮助我们开发者找到一种解决方案,面向对象程序设计理论简化了我们当今的软件开发,就目前而言的话,几乎所有的大型软件都是通过面向对象的这门理论支撑而开发的得到的,虽然说有些软件是用 C 语言写的,但是这门理论依然支撑着整个软件的生命期,所以说学习 C++ 不仅仅是学习语法,还要学习面向对象的编程思想,这个例子很好的表现了这一点;

  3,这个例子向我们展示了如何用代码展示组合关系,虽然这个代码简单,但是后面的项目当中会经常使用这个技术;

7,组合关系的特点:

1,将其它类的对象作为当前类的成员使用;‘

1,成员变量升级了,成员变量不再是基本类型的变量,成员变量升级为其它类的对象;

2,但是这样的话,类成员的成员变量和成员函数是一个什么样的存储状态,这个还有待深刻研究;

2,成员对象的生命周期与当前类的对象相同;

1,整体与部分的关系,如果部分出了问题,整体也一定出了问题,如车的车轮、电脑的内存;

3,成员对象在用法上与普通对象完全一致;

1,组合关系是面向对象理论当中最简单的一种关系;

8,分析继承关系前分析组合关系的原因:

1,类之间的两种关系为组合和继承,先讲组合是想论述类之间是真的可以存在关系的,存在了组合关系,也就可以存在继承关系;

2,讲组合关系也是因为在实际的软件开发过程当中,发现很多开发者不会正确的使用继承,往往该用组合关系的地方,他们用的是继承关系,而组合关系对应的是最简单的类之间的关系,也就对应着最简单的代码,我们的整个软件本来就已经很复杂了,我们能简单就简单些,如果能简单的地方弄复杂了,否则一堆的 bug 等着我们;

3,所以我们要先讲组合关系,再讲继承关系,就想告诉大家,在实际的工程开发里面,我们进行设计的时候,先考虑组合关系,看下组合关系能不能满足我们的需求、能不能描述我们实际的问题,如果可以就用组合关系,因为组合简单,如果不可以用组合关系,则应该看看我们当前面临的问题需要用继承来解决,因为继承肯定的比继承复杂的多的多,不是一个数量级的,这就是为什么先讲组合关系;

9,继承关系:父子关系:

1,简单的说继承关系就是父子关系;

2,惠普电脑是一种特殊电脑,苹果电脑也是一种特殊的电脑;惠普电脑是电脑的一个特化实例,可以说惠普电脑是一种电脑,但绝对不能说电脑是一种惠普电脑(这里赋值兼容性体现出来了,子类对象可以当做父类对象使用,父类对象不可以当做子类对象使用,子类就是一种特殊的父类),这是生活中的常识;

3,当两个概念之间存在这种特化关系时,其实已经发生了继承关系;惠普电脑一定会有电脑的所有特征(子类拥有父类的所有属性和行为),但是电脑不一定有惠普电脑的特征(子类可以添加父类没有的方法和属性,也可以重写父类的成员函数),因为这种关系是单向的,继承关系必然有一个角色叫做父类,另一个角色叫做子类,子类继承了父类的一切特征;

10,面向对象中的继承:

1,面向对象中的继承和生活中的继承是相似的,也是指的父子关系;

2,这种父子关系是发生在类之间,发生在类之间的父子关系很明显的就说明了有一个类是父类,而另一个类是子类;

11,面向对象中的继承指类之间的父子关系:

1,子类拥有父类的所有属性和行为;

1,惠普电脑肯定有父类的所有属性,比如内存、硬盘、CPU、主板,行为包括开机;

2,子类就是一种特殊的父类;

1,惠普电脑是一种电脑;

1,“特殊的”寓意着除了父类的特性外还有自身的特性;

3,子类对象可以当作父类对象使用;

1,我工作需要一台电脑,这里的需要的是一个父类的对象,然而我们真正提供的惠普电脑是一个子类的对象;

2,惠普电脑可以工作,这就是说明了子类对象是可以当做父类对象使用的;

3,这是很重要的一个技术,面向对象里面的很多技术都与这个技术息息相关;

4,子类中可以添加父类没有的方法和属性;

1,儿子要比父亲强大,长江后浪推前浪;

12,C++ 中通过下面的方式描述继承关系:

1,代码示例:

 class Parent
{
int mv; public:
void method();
}; class Child : public Parent // 描述继承关系;冒号代表了继承,继承自 Parent 类;
{
// ...
};

13,继承初体验编程实验:

 #include <iostream>
#include <string> using namespace std; class Parent
{
int mv;
public:
Parent()
{
cout << "Parent()" << endl;
mv = ;
}
void method()
{
cout << "mv = " << mv << endl;
}
}; class Child : public Parent
{
public:
void hello()
{
cout << "I'm Child calss!" << endl;
}
}; int main()
{
Child c; Parent p1 = c; // 子类对象可以当做父类对象使用;
Parent p2; p2 = c; // 子类对象可以当做父类对象使用; c.hello();
c.method(); // mv = 100; return ;
}

1,子类中继承了父类的成员函数,包括构造函数,意味着子类创建的时候,会调用父类的构造函数,以继承父类中属性的状态;

2,想要使用一个已经存在的类的时候,我们不用复制粘贴它的代码,可以继承得到已有类的代码,并且还可以添加新的成员;

3,继承的深层次意义就是代码复用;

14,继承重要规则:

1,子类就是一个特殊的父类;

1,子类拥有父类的所有特性,所以是父类,子类可以自己添加新的特性,所以特殊;

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

1,因为子类是一个特殊的父类;

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

15,继承的意义:

1,继承是 C++ 中代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写已有功能,或者添加新功能;

16,继承的强化练习编程实验:

 #include <iostream>
#include <string> using namespace std; class Memory
{
public:
Memory()
{
cout << "Memory()" << endl;
}
~Memory()
{
cout << "~Memory()" << endl;
}
}; class Disk
{
public:
Disk()
{
cout << "Disk()" << endl;
}
~Disk()
{
cout << "~Disk()" << endl;
}
}; class CPU
{
public:
CPU()
{
cout << "CPU()" << endl;
}
~CPU()
{
cout << "~CPU()" << endl;
}
}; class MainBoard
{
public:
MainBoard()
{
cout << "MainBoard()" << endl;
}
~MainBoard()
{
cout << "~MainBoard()" << endl;
}
}; class Computer
{
Memory mMem;
Disk mDisk;
CPU mCPU;
MainBoard mMainBoard;
public:
Computer()
{
cout << "Computer()" << endl;
}
void power()
{
cout << "power()" << endl;
}
void reset()
{
cout << "reset()" << endl;
}
~Computer()
{
cout << "~Computer()" << endl;
}
}; class HPBook : public Computer // 要继承
{
string mOS;
public:
HPBook() // 先调用父类的类成员构造函数,再调用父类的构造函数,再调用自身的构造函数;
{
mOS = "Windows 8"; // 出厂预装的 Windouw 8;
} void install(string os) // 添加新功能,安装操作系统
{
mOS = os;
} void OS() // 添加新功能,查看安装的系统
{
cout << mOS << endl;
}
}; class MacBook : public Computer // 要继承
{
public:
void OS()
{
cout << "Mac OS" << endl;
}
}; int main()
{
HPBook hp; hp.power();
hp.install("Ubuntu 16.04 LTS");
hp.OS(); cout << endl; MacBook mac; mac.OS(); return ;
}

17,小结:

1,继承是面向对象中类之间的一种关系;

2,子类拥有父类的所有属性和行为;

3,子类对象可以当作父类对象使用;

4,子类中可以添加父类没有的方法和属性;

5,继承是面向对象中代码复用的重要手段;

C++中组合和继承的概念及意义的更多相关文章

  1. C++中函数模板的概念和意义

    1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数  模板和类模板就是 C++ 中泛型编程技术,本 ...

  2. js中原型继承的概念

  3. 深入理解Java中的组合和继承

    Java是一个面向对象的语言.每一个学习过Java的人都知道,封装.继承.多态是面向对象的三个特征.每个人在刚刚学习继承的时候都会或多或少的有这样一个印象:继承可以帮助我实现类的复用.所以,很多开发人 ...

  4. C++虚继承的概念[转]

    C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数 ...

  5. C++虚继承的概念(转)

    http://blog.csdn.net/wangxingbao4227/article/details/6772579 C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同 ...

  6. 【C#小知识】C#中一些易混淆概念总结(五)---------继承 分类: C# 2014-02-06 22:05 1106人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  7. 【C#小知识】C#中一些易混淆概念总结(五)---------深入解析C#继承

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  8. C++中多态的概念和意义

    1,函数重写回顾: 1,父类中被重写的函数依然会继承给子类: 2,子类中重写的函数将覆盖父类中的函数: 1,重写父类当中提供的函数是因为父类当中提供的这个函数版本不能满足我们的需求,因此我们要重写: ...

  9. C++中的继承与虚函数各种概念

    虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个 ...

随机推荐

  1. 用CSS如何实现单行图片与文字垂直居中

    图片样式为 以下为引用的内容:.style img{vertical-align:middle;.....} 如果STYLE中有其它如INPUT或其它内联元素可写成 以下为引用的内容:.style i ...

  2. C# image/byte[]/string/互转

    public Image ByteArrayToImage(byte[] iamgebytes) { MemoryStream ms = new MemoryStream(iamgebytes); I ...

  3. https://stackblitz.com/github/cwiki-us-angular/cwiki-us-angular-app 导入后如何添加到自己的项目

    将 https://stackblitz.com/github/cwiki-us-angular/cwiki-us-angular-app 导入到界面后,如何将这个项目添加到自己的项目里面. 然后再自 ...

  4. TTTTTTTTTTTTT CF Good Bye 2015 C- New Year and Domino(CF611C) 二维前缀

    题目 题意:给你一个n*m由.和#组成的矩阵,.代表可以放,#代表不可以,问在左上角(px,py)到(右下角qx,qy)这样的一个矩阵中,放下一个长度为2宽度为1的牌有多少种放法: #include ...

  5. Android学习_7/24

    一.           活动的生命周期 1.        活动状态 运行:位于返回栈栈顶 暂停:不在栈顶,但仍可见 停止:不在栈顶,完全不可见 销毁:从栈中移除 2.        活动的生存期 ...

  6. 获取select的option值

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. 第八周课程总结 & 实验报告(六)

    第八周课程总结 一.包装类 介绍 装箱与拆箱 应用 二.异常 基本概念 基本格式 异常类的继承结构 throws关键字 throw关键字 Exception类和RuntimeException类 自定 ...

  8. shell sed应用

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:sed [-nefri] ...

  9. Kotlin 1 新运算符

    新运算符: “..” ,"in ","!in" ,"downto","step"注意: 1. 关系运算符的优先级低于算术 ...

  10. day2_Python基础二

    一.格式化输出 1.%s or %d %:表示占位符,注意,需要在内容中显示%时,在他之前增加一个%来转义,如显示5%,则:5%% s:表示字符串 d:表示数值digital 例子: name = i ...