正在加载图片...
分析下面的程序: derived d derived*dptr=&d ror b=(base*dptr;∥eror 当试图将一个指向 derived类的指针强制转换成指向base类的指针时,编译器不知道是 通过 basel还是base2继承路径。为避免这种二义性,使用下面的语句: b=(base* basel*)dptr;∥显示指明全路径 b=(basel*)di ∥强制到 basel*,然后从 basel*到base*进行隐式类型转换 上面的情况同样适用于函数调用中参数传递和返回值的情况。 多重继承比单一继承情况复杂的原因在于,派生类在这两种情况下在内存中的数据成员 布局不一样。先分析单一继承情况下数据成员在内存中的布局。设有 class bas }; class derived: public base float d 则派生类 derived的一个对象在内存中的布局如图5-3所示。 A b float d 图5-3单一继承情况下派生类的对象的内存布局 分析下面的程序: derived d base *bptr=&d/bptr指向图5-3中箭头A所指向的位置 derived*dptr=&d;/dptr指向图5-3中箭头A所指向的位置 如果派生类 derived由下面的类等级建立: class base int b class basel public base int bl class base 2: public base分析下面的程序: derived d; derived *dptr=&d; base *b; b=dptr; //error b=(base *)dptr; //error 当试图将一个指向 derived 类的指针强制转换成指向 base 类的指针时,编译器不知道是 通过 base1 还是 base2 继承路径。为避免这种二义性,使用下面的语句: b=(base *)(base1 *)dptr;//显示指明全路径 b=(base1 *)dptr; //强制到 base1 *,然后从 base1 *到 base *进行隐式类型转换 上面的情况同样适用于函数调用中参数传递和返回值的情况。 多重继承比单一继承情况复杂的原因在于,派生类在这两种情况下在内存中的数据成员 布局不一样。先分析单一继承情况下数据成员在内存中的布局。设有 class base { int b; }; class derived:public base { float d; } 则派生类 derived 的一个对象在内存中的布局如图 5—3 所示。 分析下面的程序: derived d; base *bptr=&d;//bptr 指向图 5—3 中箭头 A 所指向的位置 derived *dptr=&d;//dptr 指向图 5—3 中箭头 A 所指向的位置 如果派生类 derived 由下面的类等级建立: class base { int b; }; class base1:public base { int b1; }; class base2:public base
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有