一图以镇之
下面开始试验
class A{
public:
virtual void a() {};
};
class B{
public:
virtual int b(){return 3;}
};
class C : public A,B{
public:
virtual int c(){return 4;}
};
首先定义三个类,C继承A和B,那么根据经验,C中会有一个指向A和B的虚表指针,如此我们分别打印sizeof(...)可以得到8 8 16的结果
那么C中自己也是有一个自己的虚函数的,C中的虚函数指针放哪里了呢,答案就是C中的虚函数指针放到了指向A虚表的指针内容的后面
也就是说C中两个虚表指针*a *b
*a中存放的是A中虚函数指针和C的虚函数指针
*b存放的是b的虚函数指针
A a;B b;C c;
// *(int64_t*)取值操作
// &a就是a的地址
// *(int64_t*)&a 取a实例内存里的值,即a的虚表指针
// *(int64_t*)(*(int64_t*)&a) 取a的虚表指针指向的值,即虚函数指针
cout<<(*(int64_t*)(*(int64_t*)(&a)))<<endl;
cout<<(*(int64_t*)(*(int64_t*)(&b)))<<endl;
cout<<(*(int64_t*)(*((int64_t*)(&c)+1)))<<endl;
上面的结果为打印虚函数指针,由于c中有两个指针,第二个指针指向b的表,所以下面两行输出相同。如果没有+1,则和第一行第三行输出相同。