如何理解面向对象的封装、继承、多态

如何理解面向对象的封装、继承、多态

面向对象可以说是一种对现实是事物的抽象,将一类事物抽象成一个类,类里面包含了这类事物具有的公共部分,以及我们对这些部分的操作,也就是对应的数据和过程。

面向对象思想的三大特性,我们应该如理解呢?

封装

在面向对象思想中,对一个类,将数据和过程封包围起来,对外隐藏具体的实现细节
并且数据(成员变量和成员函数)在内部是完全自由使用的,而外部对数据的访问是加访问限定的,某些对操作只能根据由内部提供接口。



例如一个日期类,我们将日期的数据和操作放在一个类中,我们知道日期的格式是有严格限制的,构造一个日期类对象必须通过自定义构造函数来完成,我们对日期的操作只能根据类里面提供的接口,不是说可以随意的进行加减乘除操作。

继承

继承可以说是一种代码复用的手段,我们在一个现有类上想扩展出一些东西的时候,不需要再次重复编写上面的代码,而是采用一种继承的思想。在派生出的子类里添加一些我们想要的数据或方法,也可以理解为从一般到特殊的过程。



三种继承关系中,保护继承在派生思想中可能用到,私有继承几乎没有用到过。
共有继承是一种 is a 的关系,子类对象一个父类对象,与共有继承相关的组合(该类的数据成员为其他类的对象)可以说是一种has a 的关系,该对象中一个其他对象 .


例如,我们封装一个动物类,当我们想实现一个鸟类的类时,就可以采用继承的思想,鸟类动物是一类动物,动物所具有的特性鸟类动物都具有,就可以用动物类派生出鸟类,当我们想要实现一个更具体的麻雀的类时,麻雀是一种鸟,这一点毋庸置疑,就可以用鸟类派生出麻雀类。

多态

这里先说运行时多态,其实是指在继承体系中父类的一个接口(必须为虚函数),在子类中有多种不同的实现,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。即通过父类指针或者引用可以访问到子类的接口(虚函数),看上去就像是一个相同的动作,会出现多种不同的结果。



就可以理解为,调用接口时,与类型无关(用父类的指针或者引用),与对象有关(父类指针或引用指向不同的对象,而调用到不同的接口)
就可以屏蔽不同子类对象之间的差异(可以将不同的子类对象都当作父类来看),写出通用的代码,做出通用的编程,以适应需求的不断变化。
还有一种是编译时多态,函数重载,正如其名,在静态多态就是在编译期间确定的多态模型。


多态是如何实现,主要还是虚表,只要类里面有虚函数,就会在静态区开辟一块空间来保存虚函数(属于整个类域),每个对象里面都有一个虚表指针,虚表是在编译的时候进行初始化的,虚表指针是在初始化列表中初始化。我们知道用父类的指针可以指向子类对象(发生切片行为),但是虚表是不变的,访问的虚函数就是子类的虚函数了。

例如,我们实现一个平面图形的类,而又派生出矩形和圆形两个类,对于众多平面图形我们都免不了要对其进行求面积和周长的操作,并且求周长和面积的方法不同。为了通用性,我们在父类中定义求周长和面积的接口(建议纯虚函数),通过在各个子类中重定义这两个接口实现各自的求周长和求面积的操作。父类就可以通过相同的方式来调用不同子类的周长和面积的操作。

猜你喜欢

转载自blog.csdn.net/Misszhoudandan/article/details/81544945