和Inline有相同点,Inline就是编译的时候将函数直接展开来,不使用链接方式。Virtual也是影响编译和链接的一种修饰符。
- Virtual基类:(虚拟继承)用Virtual修饰类,派生类到基类存在多条路线时(多个继承脉络或者途径),一个这种派生类的对象实例化将包含多个基类对象。用Virtual来避免产生多个基类的对象在多继承下,虚继承就是为了解决菱形继承中,B,C都继承了A,D继承了B,C,那么D关于 A的引用只有一次,而不是 普通继承的 对于A引用了两次(这里需要将A定义成虚类);
- Virtual函数(虚函数):虚函数,是由于基类的指针可以执行派生类,用virtual定义的函数可以在派生类中重定义,后续引用也是引用派生类,即根据实际的子类对象动态绑定实际调用的方法。相当于允许子类重写覆盖基类函数;
- Virtual纯虚函数:也是类似作用,不写明具体实现,由子类进行实现。不在编译阶段静态绑定,而是运行的时候进行动态绑定。
综上:vitual关键字的引入,可以理解为阻止编译阶段的静态绑定,将绑定(虚函数)和约束工作(虚基类)转移到运行时动态处理。(在运行的时候,通过虚函数列表,去寻找每个对象对应的对于虚函数的实现,然后进行使用,其实类似C语言中的查表)
virtual是不能够实例化的,所以一般多用于接口类。这个就是C语言的多态性。