#include <iostream>
#include <unistd>
using namespace std;
class TestClass
{
public:
virtual void print1()
{
cout << "print1" << endl;
}
virtual void print2()
{
cout << "print3" << endl;
}
void print3()
{
cout << "print3" << endl;
}
};
typedef void (*FUNC) ();
int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused)))
{
TestClass test;
FUNC fun = (FUNC) (int *) * ((int *) * (int *) * (&test) + 0); // 第一个int *即是vptr, 取得virtual table首地址, 第二int *解引用
fun(); // 获得virtual table第一个内容, 即函数所在的位置, 第三个int *
fun = (FUNC) (int *) * ((int *) * (int *) * (&test) + 1); // 解引用获得第一个虚函数地址
fun(); // print2
fun = (FUNC)) (int *) * ((int *) * (int *) * (&test) + 2);
fun(); // coredump 非print3
exit(EXIT_SUCCESS);
}