C++集锦一 OOP
面向对象的三个基本特征是:封装、继承、多态。
封装
将客观事物抽象成类,每个类对自己的数据和方法实行protection(private,protected,public)。在面向对象程序设计语言中,封装是利用可重用成分构造软件系统的特征,它不仅支持系统的可重用性,而且有利于提高系统的可扩充性;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。
继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承现有类 + 扩展
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式有三类:实现继承、接口继承和可视继承。
Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力;
Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
Ø 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。
多态
多态是在封装和继承的基础上实现的。多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 这就是所谓的:相同对象接受不同消息或不同对象接受相同消息的行为。实际应用就是用父类指针实例化子类对象,父类成员函数需要定义为虚函数,在子类中实现。
多态的实现离不开关键字virtual,virtual修饰成员函数实现动态多态,修饰析构函数避免内存泄漏。
virtual的另一应用就是纯虚函数,含有纯虚函数的类称为抽象类,抽象类不可以实例化对象。没有数据成员,所有的成员函数都是纯虚函数的类称为接口类。
这就是多态家族。
那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
重载(overload)、重写(覆盖 override)和隐藏
(1)重载
成员函数被重载的特征:同一个类中+函数名相同+参数不同
(2)重写
是指子类重新定义父类虚函数的方法。
(3)隐藏
基类函数被隐藏情况:派生类中有同名函数且参数不同;派生类中参数相同同名函数但基类函数没有virtual关键字修饰。
重载:编译期确定 重写:运行期才确定(晚绑定)
多态的作用?
(1)隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
(2)接口重用
概念讲解
泛化(Generalization)
图表 1 泛化
Teacher , Student, Guest is“a kind of” Person
在上图中,空心的三角表示继承关系(类继承),在UML的术语中,这种关系被称为泛化(Generalization)。Person(人)是基类,Teacher(教师)、Student(学生)、Guest(来宾)是子类。
若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。
例如,教师是人,Teacher 是Person的“一种”(a kind of )。那么类Teacher可以从类Person派生(继承)。
组合
图表 2 组合
若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。
例如,眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生(继承)而成。
聚合的类型分为无、共享(聚合)、复合(组合)三类。
聚合(aggregation)
图表 3 共享
上面图中,有一个菱形(空心)表示聚合(aggregation)(聚合类型为共享),聚合的意义表示has-a关系。聚合是一种相对松散的关系,聚合类B不需要对被聚合的类A负责。
组合(composition)
图表 4 复合
这幅图与上面的唯一区别是菱形为实心的,它代表了一种更为坚固的关系——组合(composition)(聚合类型为复合)。组合表示的关系也是has-a,不过在这里,A的生命期受B控制。即A会随着B的创建而创建,随B的消亡而消亡。
依赖(Dependency)
图表 5 依赖
这里B与A的关系只是一种依赖(Dependency)关系,这种关系表明,如果类A被修改,那么类B会受到影响。