C++纯虚函数
Posted Linux编程学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++纯虚函数相关的知识,希望对你有一定的参考价值。
3 纯虚函数与抽象类
3.1 纯虚函数
假设我们要设计一个动物信息管理系统,那么,可以构建一个动物基类,命名为animal类。然后,要定义的其他的动物类,就可以继承于animal类。
那么,动物有饮食、休眠、运动等行为,这些行为我们可以封装成一个函数。这些函数在基类animal中不定义函数,要求在派生类在定义。那么,应该怎么样操作?
就是说,基类animal把一个动物的属性和行为都定义好,然后,派生类根据自己派生的动物,再定义不同的属性和行为。例如,派生类fish鱼的运动函数,是游泳。派生类cat小猫的运动函数是爬树。那么,基类只需要提供函数的声明,派生类再定义函数的具体实现。基类中的这些函数,我们可以称为:接口函数。
所以,基类声明接口函数,派生类实现接口函数。
在C++中,实现这种接口函数,就是把函数声明为“纯虚函数”。纯虚函数是在声明函数的时候,被“初始化为0”的函数。声明纯虚函数的一般形式如下:
virtual 函数名返回类型 函数名(参数列表)= 0;
声明纯虚函数有如下几点注意:
(1) 纯虚函数没有函数体;
(2) 最后面的“= 0”并不表示函数返回值为0,它只是形式上的作用。告诉编译系统“这是纯虚函数”。
(3) 这是一个声明语句,最后应有分号。
纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统:“在这里声明一个虚函数,留给派生类定义”。在派生类中对此函数定义后,它才能具备函数的功能,可以被调用。
如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。如下是一个程序测试例子:
程序运行结果如下:
可以看到,程序运行逻辑正确。定义了dog对象,然后,销毁对象的时候,调用了dog的析构函数,再调用dog继承的基类animal的析构函数。
在基类animal中声明了纯虚函数:
virtual void sleep(void) = 0;
virtual void run(void) = 0;
此时,相当于定义了sleep(), run()接口函数。然后,在派生类dog中定义这些接口函数。这些接口是一种“虚函数”。所以,通过基类指针动态访问派生类的虚函数。
所以,定义一个基类animal指针对象pa,指向派生类dog对象。然后,通过基类指针pa访问派生类对象的run()等函数。最终,调用的是派生类实现的接口函数。
以上是关于C++纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章