类对象内存布局,虚函数,虚拟继承和多重继承的实现机制
1. 无继承关系的类
2. 单一继承
2.1单层继承
2.2多重继承
3. 多重继承
一.无继承关系的类
已知A类与B类,A类代表无虚函数的类,B类代表有虚函数的类,下文都用字母表示上文多提到的类类型。
classA{
public:
int a_1;
int a_2;
A(int v1 = 1, int v2 =2)
:a_1(v1),a_2(v2){}
void show(){
cout<< "class A" << endl;
}
};
classB{
public:
int b_1;
int b_2;
B(int v1 = 1, int v2 =2)
:b_1(v1),b_2(v2){}
void virtual show(){
cout<< "class B" << endl;
}
};
做如下测试:
{
//无继承关系类对象的大小
cout<<"baseclass objects size:"<<endl;
cout<<"sizeof(A)="<<sizeof(A)<<endl;
cout<<"sizeof(B)="<<sizeof(B)<<endl<<endl;
//无继承关系类对象的数据成员在内存中的读取
Aa(1,2);
Bb(1,2);
int *pa = (int*)&a;
cout<< "data member address and its value inclass A object" << endl;
cout<<pa << " " << pa[0] << endl;
cout<<pa + 1 << " " << pa[1] <<endl;
int *pb = (int*)&b;
cout<< "data member address and its value inclass B object" << endl;
cout<<pb << " " << pb[0] << endl;
cout<<pb + 1 << " " << pb[1] <<endl;
cout<<pb + 1 << " " << pb[2] <<endl;
}
结果如下:
很明显,A类对象的内存布局如下:
int a_1 |
int a_2 |
而在B中首先放的是指向虚函数表(简称vptr)的指针,本例中虚函数表的存放地址为0x4290756,B类对象的内存布局如下:
vptr_B |
int b_1 |
int b_2 |
二.单一继承
1.单层继承
1)派生于A类的子类:
ClassC:内不增虚函数,普通继承
ClassD:内设虚函数,普通继承
ClassG:内不增虚函数,虚拟继承