#include
using namespace std;

class A{
public:
int i=3;//4 字节
virtual void testFunc (){
std::cout<<“Hello”<<std::endl;
}
};

class B{
public:
int c=4,n=5;
virtual void testFunc2(){
std::cout<<“World”<<std::endl;
}
};

class C : public A,public B{
public:
int dm=10;
};

typedef void(*Fc)(void);

int main(){
A aObj;
std::cout<<sizeof(aObj)<<std::endl;

std::cout<<&aObj<<" "<<&(aObj.i)<<std::endl;

//如果两个值不一样,代表虚函数表指针在表头
std::cout<<"第一个函数地址: "<<(int\*)\*(int\*)(&aObj)<<std::endl;

//将第一个函数的地址转换成
Fc f = (Fc)\*((int\*)\*(int\*)(&aObj));
f();

//多重继承
C cObj;
B bObj;
std::cout<<sizeof(bObj)<<" "<<sizeof(cObj)<<std::endl;

//是按照单独的类进行对齐的
bObj = cObj;
f = (Fc)\*((int\*)\*(int\*)(&bObj));
f();

int\* first = (int\*)(&cObj);
f = (Fc)\*(int\*)(\*first);
f();
//加4是下一个虚表的头,因为C++指针的++是对于类型大小的++
//至于为什么+4,因为A的字节数是16,int是4,所以要加4次
int\* mem1 = first+4;
f = (Fc)\*(int\*)(\*mem1);
f();

return 0;

}

注意,在我的电脑上,虚表是放在头部的,多继承时可以按照上面的代码看出

多级承中,每个父类都在一段内存中 (虚表,成员变量), 所以多继承中取第二个虚表需要跳过第一个父类的内存

至于为什么 + 4, 因为 sizeof (A)=16,sizeof (int)=4