以如下代码为例:
class Base1
{
public:
virtual void func1() { cout << "Base1::func1" << endl; }
virtual void func2() { cout << "Base1::func2" << endl; }
private:
int b1;
};
class Base2
{
public:
virtual void func1() { cout << "Base2::func1" << endl; }
virtual void func2() { cout << "Base2::func2" << endl; }
private:
int b2;
};
class Derive : public Base1, public Base2
{
public:
virtual void func1() { cout << "Derive::func1" << endl; }
virtual void func3() { cout << "Derive::func3" << endl; }
private:
int d1;
};
typedef void (*func)();
void print(func a[])
{
for (size_t i = 0; a[i] != nullptr; ++i)
{
printf("[%d]:%p\n", i, a[i]);
a[i]();
}
}
int main()
{
Derive d;
func* v1 = (func*)(*(int*)&d);
PrintVTable(v1);
func* v2 = (func*)*(int*)((char*)&d + sizeof(Base1));
//&d得到的是Derive*类型的,+1会跳过sizeof(Derive)个字节,所以&d要强转为char*类型,