一.虚函数的定义
被virtual关键字修饰的成员函数,目的是为了实现多态
ps:
关于多态【接口和实现分离,父类指针指向子类的实例,然后通过父类指针调用子类的成员函数,这样可以让父类指针拥有多种形态,所以称之为多态】
二.虚函数表
该表为一个类的虚函数的地址表,用于解决继承和覆盖的问题
1.拥有虚函数的类才有虚函数表
2.虚函数表属于类,然后类的所有对象通过虚函数表指针共享类的虚函数表
3.虚函数表的作用:当使用父类指针来操作子类对象时,虚函数表就像一个地图一样,指明了实际所应该调用的函数
4.c++编译器保证虚函数表的指针存在于对象实例中最前面的位置(为了保证在多层继承或者多重继承的情况下获得函数表的性能),这意味着我们可以通过对象实例的地址得到虚函数表,然后就可以遍历其中的虚函数指针,并且调用响应的虚函数
ps:多重继承:多个父类,多层继承:父类还存在父类
【通过虚函数表,遍历虚函数指针,调用响应的虚函数】
#include<bits/stdc++.h> using namespace std; class Base { public: virtual void f() { cout << "Base::f" << endl; } virtual void g() { cout << "Base::g" << endl; } virtual void h() { cout << "Base::h" << endl; } }; typedef void(*Fun)(void); Base b; Fun pFun = NULL; int main() { cout << "虚函数表地址:" << (int*)(&b) << endl; cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl; //通过虚函数表调用虚函数 pFun = (Fun)*((int*)*(int*)(&b)); // Base::f() pFun(); pFun =(Fun)*((int*)*(int*)(&b)+1); // Base::g() pFun(); pFun =(Fun)*((int*)*(int*)(&b)+2); // Base::h() pFun(); }