如果类中有虚函数,那么在类的内存中首4-8字节(取决于系统寻址范围32位的地址为4字节)会存放一个指针指向该类共有的虚函数表,虚函数表是一个指针数组,里面存放该类所有的虚函数指针(即函数指针、函数地址)。
#include <iostream>
class A
{
public:
A(){}
virtual void show()
{
std::cout << "123" << std::endl;
}
virtual ~A()
{
std::cout << "456" << std::endl;
}
};
typedef void(*Fun)(void);
int main()
{
A a;
std::cout << &a << std::endl;
std::cout << (int *)(&a) << std::endl;
Fun fun = (Fun)*((int *)*(int *)(&a));
fun();
fun = (Fun)*(((int *)*(int *)(&a)) + 1);
fun();
return 0;
}
通过上述方法可以间接的调用该函数虚函数表中的函数,但是在VS2017中使用该方法调用虚函数会报错。