很多人在程序设计的过程当中,并不是真正的面向对象,只能称为基于对象的,只是仅仅将数据和操作封装成类,并没有真正体会到面向对象的三个基本特性所带来的好处。   
   面向对象具有哪些特性?它比面向过程高级在哪?
在一般面向对象的教科书上,我们都会看到面向对象的三个基本特性:封装、继承和多态。事实上,我们尤其是刚入门的童鞋对这三个概念了解的不是很透彻,或者说不懂得怎么去描述它们。(以下引用自http://blog.chinahr.com/blog/witkin/post/47066、描述的较为透彻)。
   
一、封装性对象是属性数据和对属性数据进行的操作的结合体,封装性把这些数据和操作屏蔽起来,用户不必知道对象行为的实现细节,只需根据对象提供的外部接口访问对象即可。
封装性是面向对象的基础。面向对象系统的封装性其实是一种信息隐藏技术,它使系统设计人员能清楚地标注出他们所提供地服务接口,用户只看见对象提供地操作功能,看不到其中的数据和操作代码细节。
不让用户知道对象行为的底层实现细节,其首要目的并不是为了实现信息隐藏,而是为了控制对数据的访问机制,将实现的变更限制在可控范围内。封装不是为了给软件增加层次将底层隔离开,而是为了完成一个干净利落的接口设计。
 
从千年虫问题可以看出封装的意义,表示年份的数据结构应该是一个抽象数据类型,其物理结构不应该暴露,我们应该通过其接口获取年份数据。这样当两位整数不足以表示年份时,我们只需要改动年份的物理结构及其接口返回值,其他的部分都不用改动。遗憾的是,“实现暴露”造成了巨大的损失,有太多直接访问年份物理结构的代码需要修改,消耗了太大的人力物力。二、继承性继承是一种表示对象类之间的相似性的机制,它使得某类对象可以具有另一类对象的特征和能力。继承表示了基本类型和派生类型之间的相似性,一个基本类型具有所有由它派生出来的类型所共有的特性和行为。
继承的本质是实现代码复用,使用继承的理由是很明显的,因为新的问题与已经解决过的问题是有相似性,所以需要吸取和采纳已有解决问题的方法。因而继承机制能缩短软件的开发周期,加快编程速度。采用继承机制,还可以很好的表现程序设计过程中,从抽象到具体的层次结构关系。
 
举一个经典的例子。图形系统中,有各种各样的形体,如圆、矩形、三角形等,每个形体有位置、大小、颜色等属性,可以有移动、缩放、变色等操作。很自然的,我们可以将这些属性和操作封装成抽象形体类,而具体形体可以在基本形体类基础上派生出圆类、矩形类等特殊形体类。具体形体类继承自基本形体类,自然具有基本形体类的特性,同时还具有它们自己的特性。三、多态性不同的对象收到相同的消息时能产生不同的动作。C++语言支持两种多态性:静态多态和动态多态。静态多态是通过重载实现的,执行函数的哪个版本在编译阶段确定;动态多态性是通过虚函数实现的,执行函数的哪个版本,需要在运行时根据发出消息的对象确定。
静态多态是函数的重载,函数重载允许多个函数共享同一个函数名但是针对不同参数类型提供共同的操作。比如形体例子中,我们可以定义两个关于移动的函数,一个函数的参数是移动到的新的位置,另一个函数的参数是新位置与原位置的距离偏差。从该函数的用户的角度看,只是一个操作——移动,至于实现细节,用户不必关心。
面向对象的软件开发中,程序员常常不直接处理具体类,而把它看作基本类实例,这样就可以编写不依赖于具体类的代码。比如形体的例子中,对形体进行移动、变色等操作,而不需关心这个形体是圆还是方(实现继承)。如果对形体进行缩放操作,而圆与方的缩放方式不同,在代码中并不知道到底是对哪个形体进行缩放,而保证能调用正确的缩放函数由动态多态性来确定(虚继承)。
代码编译时并不知道会调用哪个子类的函数,直到运行时才明确。动态多态性的实现,与类中的虚函数表有关,此处不详细介绍。
 
继承和多态,是面向对象设计与面向过程最大的优势。相比较而言,采用面向对象设计的软件系统,其层次结构与实现流程,比面向过程的软件系统清晰的多。