C++虚函数

Posted Linux编程学堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++虚函数相关的知识,希望对你有一定的参考价值。

2虚函数

2.1 虚函数的作用

我们已经知道,在同一类中是不能定义两个名字相同,参数个数和类型都相同的函数的,否则,就是“重复定义”。但是,在类的继承层次结构中,在不同的层次中可以出现名字相同,参数个数和类型都相同,而功能不同的函数。

此时,应该怎么样解决“同名函数定义”的冲突问题?

C++中的虚函数就是用来解决这个问题的。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。虚函数的声明格式如下:

virtual 函数返回值类型 函数名(参数列表);

在函数的声明中,在函数返回值类型之前,添加virtual 关键字,就可以定义该函数是一个虚函数。

如下是一个测试例子。

程序运行结果如下:

可以看到,定义了基类animal,派生类dog, cat 都是从基类animal继承而来。在基类animal中定义了一个run()函数,声明为虚函数。

同时,在派生类dog, cat 中也定义了同名的run()函数。

那么,在main()函数中,操作如下:

(1) 定义一个animal类型的指针对象pa;

(2) 定义dog对象,然后,基类指针pa指向dog对象;

(3) 通过基类指针pa访问run()函数。此时,访问的是派生类dog对象中定义的run()函数,而不是基类animal对象中定义的run()函数。

(4) 通过基类指针pa访问sleep()函数,此时,由于sleep()函数没有生命为虚函数,那么,访问的是dog对象中基类animal定义的sleep()函数;

(5) 定义cat对象,然后,基类指针pa指向cat对象;

(6) 通过基类指针pa访问run()函数,访问的是派生类cat对象中定义的ruan()函数,而不是基类animal对象中定义的run()函数。

所以,可以看到,通过基类指针pa,可以访问到派生类dog或cat定义的run()函数,前提是run()函数在基类中要声明为“虚函数”。这就是所谓的“动态多态性”。

虚函数的使用方法是:

(1) 在基类用virtual 声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义定义函数的时候,不必再加上virtual关键字。

(2) 在派生类中重新定义此函数,要求函数名,参数个数,参数类型 以及 函数返回类型,都完全与基类的虚函数相同,并根据派生类的需要重新定义函数体。

C++规定:当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此,在派生类重新声明该虚函数的时候,可以加virtual,也可以不加。但习惯上一般在每一层声明函数时都应该加上virtual,使程序更加清晰。

如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。

以上是关于C++虚函数的主要内容,如果未能解决你的问题,请参考以下文章

Java和C++的虚函数的异同

C++对象模型

虚函数

C++的精髓——虚函数

C++虚函数表小记

java基础知识