- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C在单继承、多继承
一、本文目的与说明 1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的特殊性,所以在总结它的性质时将它单独列出来了。 3. 单继承、多继承、虚继承,既然都属于继承,那么虽然有一定的区别,但还是相同点比较多。如果放在一块讲,但为了将内容制作成递进的,就分开了,对相同点进行重复,(大量的复制粘贴哈),但在不同点进行了标注。? 注意:三块内容是逐步递进的? 如果你懂虚函数,那么单继承和多继承那块你就可以不看;? 如果你懂多继承,那单继承你就不要看了,至于虚继承就等你懂虚继承再回来看吧;? 如果你只懂单继承,那你就只看单继承就好。二、基本知识 1. 对于一个空类,例如;[cpp]?view plaincopyprint?class?EmptyClass{};?? 虽然你没有声明任何函数,但是编译器会自动为你提供上面这四个方法。[cpp]?view plaincopyprint?class?EmptyClass?{??public:???EmptyClass();//??默认构造函数??EmptyClass(const?EmptyClass?rhs);//??复制构造函数??~EmptyClass();//?析构函数??EmptyClass?operator=(const?EmptyClass?rhs);//??赋值运算符?}?? 对于这四个方法的任何一个,你的类如果没有声明,那么编译器就会自动为你对应的提供一个默认的。(在《C++ primer》中,这个编译器自动提供的版本叫做“合成的***”,例如合成的复制构造函数)当然如果你显式声明了,编译器就不会再提供相应的方法。 2.?合成的默认构造函数执行内容:如果有父类,就先调用父类的默认构造函数。 2.?合成的复制构造函数执行内容:使用参数中的对象,构造出一个新的对象。 3.?合成的赋值操作符执行内容:使用参数中的对象,使用参数对象的非static成员 依次对 目标对象的成员赋值。注意:在赋值操作符执行之前,目标对象已经存在。 4. 在继承体系中,要将基类(或称为父类)的析构函数,声明为virtual方法(即虚函数)。 5. 子类中包含父类的成员。即子类有两个部分组成,父类部分和子类自己定义的部分。 6. 如果在子类中显式调用父类的构造函数,只能在构造函数的初始化列表中调用,并且只能调用其直接父类的。 7. 在多重继承时,按照基类继承列表中声明的顺序初始化父类。 8. 在虚继承中,虚基类的初始化?早于?非虚基类,并且子类来初始化虚基类(注意:虚基类不一定是子类的直接父类)。?三、单继承核心:在构造子类之前一定要执行父类的一个构造函数。1.构造函数(不包括复制构造函数)。 顺序:①直接父类;②自己? 注意:若直接父类还有父类,那么“直接父类的父类”会在“直接父类” 之前 构造。 可以理解为这是一个递归的过程,知道出现一个没有父类的类才停止。 2.1 如果没有显式定义构造函数,则“合成的默认构造函数”会自动调用直接父类的“默认构造函数”,然后调用编译器为自己自动生成的“合成的默认构造函数”。? 2.2 如果显式定义了自己的构造函数? 2.2.1 如果没有显式调用直接父类的任意一个构造函数,那么和“合成的默认构造函数”一样,会先自动调用直接父类的 默认构造函数,然后调用自己的构造函数。? 2.2.2 如果显式调用了直接父类的任意一个构造函数,那么会先调用直接父类相应的构造函数,然后调用自己的构造函数。2. 复制构造函数 顺序:①直接父类;②自己? 注意:和构造函数一样,若直接父类还有父类,那么“直接父类的父类”会在“直接父类” 之前 构造。 可以理解为这是一个递归的过程,知道出现一个没有父类的类才停止。 2.1 如果?没有显式定义复制构造函数,则“合成的复制构造函数”会自动调用直接父类的“复制构造函数”,然后调用编译器为自己自动生成的“合成的复制构造函数”(注意:不是默认构造函数)? 2.2 如果显式定义了自己的复制构造函数 (和构造函数类似)? 2.2.1 如果没有显式调用父类的任意一个构造函数,那么会先调用直接父类的 默认构造函数(注意:不是 复制构造函数)。? 2.2.2 如果显式调用了直接父类的任意一个构造函数,那么会先调用直接父类相应的构造函数。3.赋值操作符重载 3.1 如果没有显式定义,会自动调用直接父类的赋值操作符。(注意:不是 默认构造函数)? 3.2 如果显式定义了,就只执行自己定义的版本,不再自动调用直接父类的赋值操作符,只执行自己的赋值操作符。? 注意:如有需要对父类子部分进行赋值,应该在自己编写的代码中,显式调用父类的赋值操作符。?4. 析
有哪些信誉好的足球投注网站
文档评论(0)