cpp
#include<iostream>
class B
{
public:
int b;
public:
B(int i = 1) : b(i) {}
virtual void f() { std::cout << "B::f()"; }
virtual void Bf() { std::cout << "B::Bf()"; }
};
class B1 : virtual public B
{
public:
int b1;
public:
B1(int i = 100) :b1(i) {}
virtual void f() { std::cout << "B1::f()"; }
virtual void f1() { std::cout << "B1::f1()"; }
virtual void B1f() { std::cout << "B1::B1f()"; }
};
int main()
{
B1 a;
std::cout << "B1对象内存大小为:" << sizeof(a) << std::endl;
//取得B1的虚函数表
std::cout << "[0]B1::vptr";
std::cout << "\t地址:" << (int *)(&a) << std::endl;
typedef void(*Fun)(void);
//输出虚表B1::vptr中的函数
for (int i = 0; i < 2; ++i)
{
std::cout << " [" << i << "]";
Fun fun1 = (Fun)*((int *)*(int *)(&a) + i);
fun1();
std::cout << "\t地址:" << *((int *)*(int *)(&a) + i) << std::endl;
}
//[1]
std::cout << "[1]vbptr ";
std::cout << "\t地址:" << (int *)(&a) + 1 << std::endl; //虚表指针的地址
//输出虚基类指针条目所指的内容
for (int i = 0; i < 2; i++)
{
std::cout << " [" << i << "]";
std::cout << *(int *)((int *)*((int *)(&a) + 1) + i);
std::cout << std::endl;
}
//[2]
std::cout << "[2]B1::ib1=" << *(int*)((int *)(&a) + 2);
std::cout << "\t地址:" << (int *)(&a) + 2;
std::cout << std::endl;
//[3]
std::cout << "[3]值=" << *(int*)((int *)(&a) + 3);
std::cout << "\t\t地址:" << (int *)(&a) + 3;
std::cout << std::endl;
//[4]
std::cout << "[4]B::vptr";
std::cout << "\t地址:" << (int *)(&a) + 4 << std::endl;
//输出B::vptr中的虚函数
for (int i = 0; i < 2; ++i)
{
std::cout << " [" << i << "]";
Fun fun1 = (Fun)*((int *)*((int *)(&a) + 4) + i);
fun1();
std::cout << "\t地址:" << *((int *)*((int *)(&a) + 4) + i) << std::endl;
}
//[5]
std::cout << "[5]B::ib=" << *(int*)((int *)(&a) + 5);
std::cout << "\t地址:" << (int *)(&a) + 5;
std::cout << std::endl;
}
验证结果:

参考文章
图说C++对象模型:对象内存布局详解