面向对象的三大特性:封装、继承、多态
一、封装
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽对象数据类型将数和基于数据操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽相关数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不是依赖其他对象就可以完成自己的操作。
使用封装的四大好处:
1.良好的封装能减少耦合
2.类内部的结构可以自由修改。
3.可以对成员进行更精确的控制。
4.隐藏信息,实现细节。
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也就没有什么意义了。
二、继承
继承是使用已存在的类的定义作为基础建立新类的技术。新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便的复用以前的代码,能够大大的提高开发的效率。
1.子类拥有父类非private的属性和方法
2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方式实现父类的方法。
谨慎继承:
1.父类变,子类就必须变
2.继承破坏了封装,对于父类而言,它的实现细节对子类来说都是透明的。
3.继承是一种强耦合关系。(模块之间越紧密,耦合性越强。对象之间的耦合度就是对象之间的依赖性)
三、多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法到底是哪个类中实现的方法,必须由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
也就是在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数
1.用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。
2.存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。
3.多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。
4.多态用虚函数来实现,结合动态绑定.
5.纯虚函数是虚函数再加上 = 0;
6.抽象类是指包括至少一个纯虚函数的类。
纯虚函数:virtual void fun()=0;即抽象类!必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。
对于面向对象而言,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编译之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。
多态实现的条件:
子类Child继承父类Father,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类Father对象,也可以处理子类Child对象,当相同的消息发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为,这就是多态。即多态性就是相同的消息使得不同的类做出不同的响应。