C++集锦一 OOP

面向对象的三个基本特征是:封装、继承、多态。

 

C++集锦一 OOP

 封装

将客观事物抽象成类,每个类对自己的数据和方法实行protection(private,protected,public)。在面向对象程序设计语言中,封装是利用可重用成分构造软件系统的特征,它不仅支持系统的可重用性,而且有利于提高系统的可扩充性;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。


继承

面向对象编程 (OOP) 语言的一个主要功能就是继承。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展继承现有类 + 扩展


在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 

继承概念的实现方式有三类:实现继承、接口继承和可视继承。 

Ø         实现继承是指使用基类的属性和方法而无需额外编码的能力; 

Ø         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; 

Ø         可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。  


多态

多态是在封装和继承的基础上实现的。多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 这就是所谓的:相同对象接受不同消息或不同对象接受相同消息的行为。实际应用就是用父类指针实例化子类对象,父类成员函数需要定义为虚函数,在子类中实现。


多态的实现离不开关键字virtual,virtual修饰成员函数实现动态多态,修饰析构函数避免内存泄漏。

virtual的另一应用就是纯虚函数,含有纯虚函数的类称为抽象类,抽象类不可以实例化对象。没有数据成员,所有的成员函数都是纯虚函数的类称为接口类。

这就是多态家族。

 

那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用家谱中任一类的实例的某一属性时的正确调用。

 

重载(overload)、重写(覆盖 override)和隐藏

(1)重载

成员函数被重载的特征:同一个类中+函数名相同+参数不同

(2)重写

是指子类重新定义父类虚函数的方法。

(3)隐藏

基类函数被隐藏情况:派生类中有同名函数且参数不同;派生类中参数相同同名函数但基类函数没有virtual关键字修饰。


  重载:编译期确定      重写:运行期才确定(晚绑定)

 

 多态的作用?

(1)隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

(2)接口重用

 

概念讲解

泛化(Generalization 

 

C++集锦一 OOP

 

图表 1 泛化

 

Teacher , Student, Guest  is“a kind of” Person

 

在上图中,空心的三角表示继承关系(类继承),在UML的术语中,这种关系被称为泛化(Generalization)。Person()是基类,Teacher(教师)Student(学生)Guest(来宾)是子类。 

若在逻辑上BA的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。 

例如,教师是人,Teacher Person的“一种”(a kind of )。那么类Teacher可以从类Person派生(继承)。  

 

组合

 

C++集锦一 OOP

 

图表 2 组合 

 

若在逻辑上AB“一部分”(a part of,则不允许BA派生,而是要用A和其它东西组合出B 

例如,眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类EyeNoseMouthEar组合而成,不是派生(继承)而成。 

聚合的类型分为无、共享(聚合)、复合(组合)三类。 

聚合(aggregation 

 

 

 

C++集锦一 OOP

 

图表 3 共享 

 

上面图中,有一个菱形(空心)表示聚合(aggregation)(聚合类型为共享),聚合的意义表示has-a关系。聚合是一种相对松散的关系,聚合类B不需要对被聚合的类A负责。 


组合(composition 

 

C++集锦一 OOP

 

图表 4 复合 

 

这幅图与上面的唯一区别是菱形为实心的,它代表了一种更为坚固的关系——组合(composition)(聚合类型为复合)。组合表示的关系也是has-a,不过在这里,A的生命期受B控制。即A会随着B的创建而创建,随B的消亡而消亡。 

 

依赖(Dependency)

 

C++集锦一 OOP

 

图表 5 依赖 

 

这里BA的关系只是一种依赖(Dependency)关系,这种关系表明,如果类A被修改,那么类B会受到影响。