C++ 虚继承内存布局分析:类成员地址验证
#include
class A //基类A { public: int dataA; };
class B : virtual public A { public: int dataB; };
class C : virtual public A { public: int dataC; };
class D : public B,public C { public: int dataD; }; //编写测试主函数,测试各个类的内存分配情况 int main() { D *d=new D; d->dataA=10; d->dataB=100; d->dataC=1000; d->dataD=10000; cout<<&d->dataA<<endl; cout<<&d->dataB<<endl; cout<<&d->dataC<<endl; B *b=d; C *c=d; cout<< endl; cout<<&b->dataA<<endl; cout<<&b->dataB<<endl; cout<<&c->dataC<<endl; A fromB=(B)d; A fromC=(C)d; cout <<&fromB->dataA<<endl;
return 0;
}
运行结果:
0x1d7b020 0x1d7b024 0x1d7b028
0x1d7b020 0x1d7b024 0x1d7b028
0x1d7b020
解析:
本程序定义了4个类,其中类B和类C都使用了虚继承,类D继承了类B和类C。由于虚继承会导致内存布局的调整,因此我们需要验证类成员的内存分配情况。
在主函数中,我们定义了一个指向类D对象的指针d,并分别给dataA、dataB、dataC、dataD赋值,然后分别输出它们的地址。结果显示,它们的地址依次递增,符合我们的预期。
接下来,我们将指针d强制转换为指向类B和类C的指针b和c,并分别输出它们的dataA、dataB、dataC成员的地址。由于类B和类C都虚继承了类A,因此它们的dataA成员地址都与指针d相同,而dataB和dataC成员地址则依次递增,与指针d的地址相差4和8个字节,这也符合我们的预期。
最后,我们将指针d强制转换为指向类A的指针,并输出dataA成员的地址。由于类B和类C都虚继承了类A,因此指针d的dataA成员地址与类B和类C的dataA成员地址相同,而强制转换后输出的dataA成员地址也与之相同。
原文地址: https://www.cveoy.top/t/topic/nA3Y 著作权归作者所有。请勿转载和采集!