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++纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 纯虚函数

不使用纯虚函数的 C++ 接口

C++ 纯虚函数接口,标准 C 导出 DLL 函数的用法

纯虚函数的 C++ 继承

C++学习笔记11--纯虚函数和抽象类

C ++:私有虚函数与纯虚函数[重复]