作者:良知犹存
转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
一、抽象类出现的标志
之我们讲到虚拟继承的使用,在那篇文章中介绍了虚拟函数,用virtual标记的函数,C++的虚拟继承(基础)没有看到的朋友,可以看这篇文章了解一下。
一个虚函数等于0,则此虚函数为纯虚函数。如果一个类有纯虚函数则这样的类就是抽象类。
示例如下:
class Human { private: inta; int type; public: virtualvoid eating(void) =0;/*纯虚函数*/ virtual void wearing(void)=0; virtual void drving(void)=0; virtual~Human() { cout<<"~Human()"<<endl; } virtual Human* test(void) { cout<<"Englishman test()"<<endl; return this; } };
二、引入原因
更加方便的解决多态的问题(多重继承或者一个基类被多次继承)。解决派生的基类实体化问题,例如:我们定义一个基类是人类,通过继承基类,我们派生出英国人,中国人,美国人,如果人类这个基类是普通类,则它也会生成实体化对象,一个组成物体的元素也生成对象,这个是不被接受的。所以我们定义基类为抽象类(含有纯虚函数的类),而抽象类不能被申明为一个实体变量。
抽象类可以作为一个接口,通过作为一个继承中的最底层类存在,定义程序框架。
抽象类不可以被申明为一个实体变量
int main(uint argc,char ** argv) { Human h; }
三、使用规则
如果派生类中没有对纯虚函数进行定义,则派生类也会成为一个抽象类,也不可以被申明为实体变量,需要再次派生一个子类,直至将基类的纯虚函数定义。派生类定义纯虚函数的时候可以写virtual 也可以不写。
非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。
四、使用纯虚函数优势
减少代码量
在继承基类的时候,编译器阻止程序生成实例化对象
五、进一步学习
多人编写程序的时候,一共分为两种,一种是应用编程,根据提供的类进行使用;一种是提供类,进行类编程。
但是编写代码过程中由于头文件的包含,类文件修改导致应用程序部分需要重新编译,所以需要一个相对固定的包含的头文件包含相应函数(抽象类界面或者叫接口)进行编译.
利用动态库的应用,我们就可以对程序的底层的类进行修改而不会影响到main中应用使用逻辑造成影响。我的.so文件关联到类的实现,编译随着类的修改而变化,而main.cpp不受类文件的修改而影响。
使用动态链接库,需要设置LD_LIBRARY_PATH (linux 环境变量名)
设置路径到当前目录,发现成功运行,
修改类文件再进行编译:
下一篇文章再着重分析一下抽象类与接口(类)。