正在加载图片...
void f20 class derived: public basel, public base2 float d 则派生类 derived的一个对象在内存中的布局如图5-4所示。 A→:in+1 base basel int b1 derived base2 图5-4多重继承情况下派生类的对象的内存布局 和单一继承情况作比较,A位置由 derived*类型和base*类型的指针指向,而B位置 由base2*类型的指针指向,base2类的数据成员不再从开始位置A存放 将 derived类的对象d的地址置给 basel*类型和base2*类型的指针时会产生不同的效 果,即 base l* bptr I=&d;/&d指向A位置,但 bptrI指向A位置 base2*bpt2=&d;∥&d指向A位置,但 bptr I指向B位置,编译器将调整&d的值为 /l(char *)&d+sizeof(basel) 反过来,从指向 basel类或bae2类的指针转换成指向对应的base类的指针时,可分别 指向A位置和B位置,但从 derived*强制转换到base*时必须指定路径,否则会产生二义 性 一个base*类型的指针也不能直接转换成 derived*类型的指针: derived*dptr dptr( derived*)bptr/ero,不知道转换路径 dpt=( derived*)( basel*)bptr;/ correct, bptr的值不作调整 dpt=( derived*)(base*)bptr;/ orrect, bptr的值要调整为指向A的位置{ int b2; public: void f2(); }; class derived:public base1,public base2 { floadt d; }; 则派生类 derived 的一个对象在内存中的布局如图 5—4 所示。 和单一继承情况作比较,A 位置由 deerived *类型和 base *类型的指针指向,而 B 位置 由 base2 *类型的指针指向,base2 类的数据成员不再从开始位置 A 存放。 将 derived 类的对象 d 的地址置给 base1 *类型和 base2 *类型的指针时会产生不同的效 果,即 base1 *bptr1=&d;//&d 指向 A 位置,但 bptr1 指向 A 位置 base2 *bptr2=&d;// &d 指向 A 位置,但 bptr1 指向 B 位置,编译器将调整&d 的值为 //(char *)&d+sizeof(base1) 反过来,从指向 base1 类或 base2 类的指针转换成指向对应的 base 类的指针时,可分别 指向 A 位置和 B 位置,但从 derived *强制转换到 base *时必须指定路径,否则会产生二义 性。 一个 base *类型的指针也不能直接转换成 derived *类型的指针: base *bptr; derived *dptr; dptr=(derived *)bptr;//error,不知道转换路径 dptr=(derived *)(base1 *)bptr;//correct,bptr 的值不作调整 dptr=(derived *)(base2 *)bptr;//correct,bptr 的值要调整为指向 A 的位置
<<向上翻页
©2008-现在 cucdc.com 高等教育资讯网 版权所有