一、前言
个人笔记,不保证严谨和正确☺,如有错误还望指出!
二、取地址
class Base
{
public:
long long value;
virtual f();
};
typedef void(*ptrType)(void);
Base b;
cout << "虚函数表地址:" << (ptrType*)(&b) << endl;
cout << "虚函数表 — 第一个函数地址:" << (ptrType*)*(ptrType*)(&b) << endl;
// 方法一
ptrType* pHead = (ptrType*)(&b); // pHead: 指向的是类空间首地址(即,虚函数表地址)
ptrType* pVptr = (ptrType*)(*pHead); // pVptr: 虚函数表第一个函数地址
ptrType F = (ptrType)*(pVptr+i); // 取第i+1个虚函数指针, Base::f()
F(); // i = 0, 执行第1个虚函数 Base::f()
long long value = *(long long *)(pHead + 1); // Base::value
// 方法二
ptrType** pVtab = (ptrType**)&b; // pVtab[0] 内存布局首地址,如有虚指针为虚
ptrType F = (ptrType)pVtab[0][0]; // 取第1个虚函数指针, Base::f()
long long value = (long long)*(&pVtab[1]; // Base::value
三、含有虚函数的基类
3.1 基类定义
class Parent
{
public:
long long iparent;
Parent ():iparent (10) {}
virtual void f() { cout << "Parent::f()" << endl; }
virtual void g() { cout << "Parent::g()" << endl; }
virtual void h() { cout << "Parent::h()" << endl; }
};
3.2 类图和内存布局
类图
<