面向对象的4要素:抽象,封装,继承,多态

在平时说到面向对象的特性的时候,通常的答案有几种。数据结构

若是是面向对象的3大基本特征:①抽象,继承,多态   ② 封装,继承,多态函数

若是是4特征:抽象,封装,继承,多态spa


可见抽象与封装这两个概念其实联系是很紧密的。设计

而我确实想要搞清楚具体的含义,今天进行一个总结。指针


参考书目:《代码大全 2th》《C++ Primer 5th》以及网上的一些资料。对象

其中关于抽象与封装,以代码大全为主要参考。继承

关于多态以C++ Primer为主要参考。接口

其中我引用原文的地方都会首先标出,我开始本身总结时又会空一行开始。编译

内容为:抽象与封装,C++的多态。基础


1.抽象与封装

主要参考的是代码大全5,6两章。

5.3节---造成一致抽象

原文:抽象是一种能让你在关注某一律念的同时能够放心地忽略其中一些细节的能力——在不一样的层次处理不一样的细节。

5.3节---封装实现细节

原文:封装填补了抽象留下的空白。

6.1节---抽象数据类型

原文:抽象数据类型(ADT)是指一些数据以及对这些数据所进行的操做的集合。

6.2节---良好的封装

原文:封装是一个比抽象更强的概念。抽象经过提供一个可让你忽略实现细节的模型来管理复杂度,而封装则强制阻止你看到细节。

这两个概念之因此相关,是由于没有封装时,抽象每每很容易被打破。


书中一个准则是,当咱们在操做数据的时候,不该该用对象直接对数据进行访问,咱们应该使用与数据对应的那些操做去操纵数据。
而这些操做(子程序)若是对于外部可见,就是类的公开接口。
而公开接口就是一种抽象,它避免了咱们在数据结构的低层次上操纵数据。

所以,个人理解是

咱们在定义一个类的时候,设计了类的数据成员(private),方法,并规定了哪些方法public,哪些方法private。

这个过程自己既包括了抽象,也包括了封装。
若是必定要进行一个划分,
那么

抽象:将数据,方法整合到一个类里面,而且但愿使用者只使用方法去操做数据成员,并且但愿哪些方法应该被类使用者调用。

封装:而后在此基础上,物理上规定哪些成员为public,哪些成员为private。


因此做者说的,让咱们在不一样层次上处理细节。个人理解是:
假如说有一个聚会人员名单,你使用一个queue来保存每个报名者,那么你对人员的增删就须要对于这个queue来操做。这是具体的数据结构层次。
若是你抽象为ADT,那么使用者就对聚会人员这个对象直接add(某人),或者delete(某人)这样的操做,使用者也不知道是用vector,仍是queue,仍是stack来存的。


做者说的,封装填补了抽象留下的空白。个人理解是:
封装保证了抽象想要达到的目的的实现。由于封装在抽象的基础上,规定了public,private。这样强制规定了可见性。这就是填补了空白的意思。


2.多态

C++的多态广义上来讲有:静态多态性,动态多态性。

静态多态性一般称为编译时多态,经过函数重载来实现。

动态多态性一般称为运行时多态,经过虚函数来实现。

在面向对象的范畴来讲的多态特征,是指动态多态性。这个特性在C++ Primer 5th中被直接描述为动态绑定(dynamic binding)或者运行时绑定(run-time binding)。


15.3节---虚函数

原文:引用或指针的静态类型与动态类型不一样这一事实正是C++语言支持多态性的根本所在。

经过对象进行的函数调用将在编译时绑定到该对象所属类的函数版本上。

当且仅当对经过指针或者引用调用虚函数时,才会在运行时解析该调用,也只有在这种状况下对象的动态类型才有可能与静态类型不一样。


15章术语表

原文:动态类型(dynamic type)对象在运行时的类型。引用所引用对象或者指针所指对象的动态类型可能与该引用或指针的静态类型不一样。

基类的指针或引用能够指向一个派生类对象。

在这样的状况下,静态类型是基类的引用(或指针),而动态类型是派生类的引用(或指针)。

动态绑定(dynamic binding)直到运行时才肯定到底执行函数的哪一个版本。

在C++语言中,动态绑定的意思是在运行时根据引用或指针所绑定对象的实际类型来选择执行虚函数的某一个版本。


集合术语来看,书中讲的已经很是明白了。由于自己在继承的基础上就存在静态与动态类型2种类型。

动态绑定的两个必要条件就是:

①基类中必须使用虚函数或纯虚函数。

②调用函数时要使用基类的指针或者引用。