- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[比较]: 对于普通基类,派生类的构造函数只负责调用其直接基类的构造函数以初始化其直接基类的数据成员。 对于虚基类,必须在派生类中对虚基类初始化。 [问题]: 在上例中类Derived的构造函数通过初始化表调用了虚基类的构造函数Base,而类B1和类B2的构造函数也通过初始化表调用了虚基类的构造函数Base,这样虚基类的构造函数岂不是被调用了3次? [解答]: C++编译系统只执行最近派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类(如类B1和类B2)对虚基类的构造函数的调用,这就保证了虚基类的数据成员不会被多次初始化。 当在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数的执行。 [例]: 见例exam9.7。 3.4 基类与派生类之间的转换 问题1:派生类对象可以向基类对象转换吗? [解答]: 在设计类的层次结构时,应该使得派生类在逻辑上是一种“特殊的”基类。例如,卡车是一种汽车,猫是哺乳动物。 因此,在任何需要基类对象的地方使用派生类对象,是有意义的、合乎逻辑的。 在满足一定的限定条件的前提下,C++语言可以自动地把一个派生类对象隐式地转换成一个基类对象。 在这种情况下,实际上是用派生类对象从基类继承来的数据成员的值,给基类对象相应数据成员赋值。 基类 基类数据成员 基类成员函数 派生类 基类数据成员 基类成员函数 派生类数据成员 派生类成员函数 赋值时此部分舍弃不用 [解答]: 由于通常基类在逻辑上未必是某个派生类,例如,汽车未必是卡车,哺乳动物也并不等于猫。因此,在需要派生类对象的地方使用基类对象来代替,是不合逻辑的,也是不正确的。 实际上,派生类对象中拥有的数据成员,在基类对象中不一定都有。因此,如果使用基类对象给派生类对象赋值,赋值后派生类对象的某些数据成员的值将是无定义的。 因此,C++语言不允许使用基类对象给派生类对象赋值。 问题2:基类对象可以向派生类对象转换吗? 1. 赋值兼容规则 能够把一个派生类对象隐式地转换成一个基类对象的前提条件是:派生类从其基类公有派生。 例如,下面定义的两个类: class Base {…}; class Derived: public Base {…}; 则派生类Derived的对象具备自动转换成其基类Base的对象的条件。 C++允许以下几种形式的转换: 可以用派生类对象给基类对象赋值。 可以用派生类对象来初始化基类的引用。 可以把派生类对象的地址赋值给指向基类的指针。 可以把指向派生类对象的指针赋值给指向基类对象的指针。 1) 可以用派生类对象给基类对象赋值。 [例]: Base b; Derived d; b=d; //用派生类Derived的对象d对基类Base的对象b赋值 2) 可以用派生类对象来初始化基类的引用。 [例]: Derived d; Base br=d; //定义基类Base对象的引用变量br,并用派生类Derived的对象d对其初始化 3) 可以把派生类对象的地址赋值给指向基类的指针。 [例]: Derived d; Base *bptr=d; 这种形式的转换,是在实际应用程序中最常见到的。 4) 可以把指向派生类对象的指针赋值给指向基类对象的指针。 [例]: Derived *dptr; Base *bptr=dptr; [说明]: 如果希望把一个基类指针转换成一个派生类指针,必须显式地使用强制类型转换机制。 [例]: Derived*dptr=(Derived*)bptr; [例]:见例exam10.2。 #include iostream using namespace std; class Base { public: void Who() { coutI am base class!endl; } }; class Derived1:public Base { public: void Who() { coutI am Derived1 class!endl; } }; class Derived2:public Base { public: void Who() {coutI am Derived2 class!endl; } }; int main() { Base base_obj; Base *p; Derived1 one_obj; Derived2 two_obj; p=base_obj; p-Who(); p=one_obj; //基类指针p指向派生类Deri
文档评论(0)