virtual 用于在类中定义一个成员函数,这个函数叫做虚函数,且不能是静态的。定义如下
class 类名{
...
virtual 返回类型 函数名(形式参数列表)
...
}
当在派生类中定义了一个同名的成员函数是,只要该成员函数的参数个数和类型以及返回类型与基类中的同名的虚函数完全一样,则派生出来的这个成员函数无论是否使用virtual,他都将成为一个虚函数。程序员习惯给派生的同名函数也加上virtual,以便于阅读理解。
以下参考了网上其他博客:
在c++语言中,从代码到程序的运行,要经历编译和连接,针对这两个不同的阶段,c++设计了不同的机制,其中virtual和inline就是区分编译器工作和链接器工作的标志;
inline很容易理解,生命为inline的函数在编译阶段即被展开成代码,而非inline的函数采用运行时链接的方式处理;
virtual关键字,我只在这里谈三个地方的用途:
1、virtual基类
在多重继承中,从派生类到基类存在多条路线时(多个继承脉络或者途径),一个这种派生类的对象实例化将包含多个基类对象,浪费资源且调用混乱的现象出现。因此引入了virtual baseclass,来在运行阶段克服多个基类对象的产生。这个vitual是在运行阶段保证对象唯一性的。
2.virtual函数
虚函数的出现,是由于基类的指针可以执行派生类,因此引出了不便,如
class deriv:public class base
{
public:
void show();
}
当
deriv d;
base* b;
b=&d;
b->show();
这里的show应该调用谁的呢?我们的意思肯定是调用d的,但是编译器处理的话b和base类是绑定在一起的,他实际上是会调用b的show函数。
因此,我们引入virtual函数,来告诉编译器,出现这种情况时,在运行时动态链接进行处理。
3.virtual在纯虚函数中使用
纯虚函数完全是为了继承体系的完整,也是集成virtual函数的作用而产生的。代表了编译器阶段对象的绑定,将调用选择转移到运行时动态绑定。
综上:virtual关键的引入,可以理解为阻止编译阶段的静态绑定,将绑定(虚函数)和约束工作(虚基类)转移到运行时动态处理。