语法:在类中声明时,声明前用virtual关键字;后面函数实现时,不用加virtual;
作用:在一个基类指针指向其派生类对象时,使得该指针调用基类和派生类中同名函数时可以有不同的效果;
例:Base *b=new Derived();两个类中都有show函数;
若基类中show函数不是虚函数,派生类中show函数不是虚函数,则该指针调用的show函数是基类中的show函数;
若基类中show函数不是虚函数,派生类中show函数是虚函数,则该指针调用的show函数是基类中的show函数;
若基类中show函数是虚函数,派生类中show函数不是虚函数,则该指针调用的show函数是派生类中的show函数;
若基类中show函数是虚函数,派生类中show函数是虚函数,则该指针调用的show函数是派生类中的show函数;
总结:有一个虚函数时,虚函数被隐藏,调用另外一个同名函数;两个都是虚函数时,调用派生类同名函数;无虚函数时,调用指针的类型的类的虚函数;
可复制代码,通过增删基类和派生类中virtual来验证:
#include <bits/stdc++.h>
using namespace std;
class Base {
public:
virtual void f() {
cout << "Base::f" << endl;
}
void g() {
cout << "Base::g" << endl;
}
};
class Derived:public Base {
public:
virtual void f() {
cout << "Derived::f" << endl;
}
void g() {
cout << "Derived::g" << endl;
}
};
int main(void) {
Derived d2;
Base *b1=&d2;
b1->f();
return 0;
}
具体实现,是因为有虚函数表,可参考:
https://blog.csdn.net/lyztyycode/article/details/81326699
而虚函数的在实际工作中意义,可参考: