欢迎来到天天文库
浏览记录
ID:48755153
大小:2.54 MB
页数:63页
时间:2020-01-21
《第6讲 虚基类、多态性和虚函数new.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第六讲虚基类、多态性和虚函数武汉大学王泉德1一、虚基类1.单继承classAclassBclassC2多重继承和虚基类2.多重继承classAclassBclassC3多重继承派生类的定义设类B是类A1、A2、…、An的派生类,多重继承的派生类的定义形式为:class:[<派生方式1>],[<派生方式2>],…,[<派生方式3>]{...//派生类新增加的成员列表};4例定义一个派生类C,它是类A和B的派生类。classA{protected:inta;public:voi
2、dSetA(intna);};classB{protected:intb;public:voidSetB(intnb);};classC:publicA,publicB{private:intc;public:intSetAB(intna,intnb);};5多重继承中的二义性问题classC:publicA{public:intc;};classD:publicB,publicC{public:intd;};main(){Dd1;d1.a=100;}classA{public:inta;};class
3、B:publicA{public:intb;};6多重继承中的二义性问题classBclassCclassDclassADBACA派生类D的对象中存在间接基类A的两份副本7解决方法一利用作用域限定符(::)把基类的成员与下一层基类关联起来:d1.B::a=100;//d1.C::a=100缺点:浪费了存储空间;在访问基类的成员时,要求指明访问路径。大部分情况下不需要保存基类多个相同的副本。8解决方法二(虚基类)虚基类并不是一种新的类型的类,而是一种派生方式。采用虚基类方式定义派生类,在创建派生类的对象时
4、,类层次结构中虚基类的成员只出现一次,即基类的一个副本被所有派生类对象所共享。9虚基类classBclassCclassDclassADBAC10虚基类派生方式的定义采用虚基类方式定义派生类的方法是在基类的前面加上关键字virtual,而定义基类时与一般基类完全一样。语法如下:class<派生类名>:virtual<派生方式><共同基类名>例采用virtual虚基类方式定义派生类。classB:virtualpublicA{public:intb;};classC:virtualpublicA{publ
5、ic:intc;};主函数中:d1.a=100;11虚基类的初始化虚基类的初始化与一般多继承的初始化在语法上相同,但构造函数的调用顺序有所不同,规则如下:先调用虚基类的构造函数,再调用非虚基类的构造函数。若同一层次包含多个虚基类,其调用顺序为定义时的顺序。若虚基类由非虚基类派生而来,则仍按先调用基类构造函数,再调用派生类构造函数的顺序。12引入虚基类后构造函数的调用顺序举例#includeclassBase1{public:Base1(){cout<<"classBase1";c
6、out<7、;}};classTopLevel:publicLevel1,virtualpublicLevel2{public:TopLevel(){cout<<"classTopLevel";cout<8、对象时所指定的类称为最(远)派生类。虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其它基类对虚基类构造函数的调用被忽略。15二、多态性和虚函数何谓多态性?多态性也是面向对象程序设计方法的一个
7、;}};classTopLevel:publicLevel1,virtualpublicLevel2{public:TopLevel(){cout<<"classTopLevel";cout<8、对象时所指定的类称为最(远)派生类。虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其它基类对虚基类构造函数的调用被忽略。15二、多态性和虚函数何谓多态性?多态性也是面向对象程序设计方法的一个
8、对象时所指定的类称为最(远)派生类。虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其它基类对虚基类构造函数的调用被忽略。15二、多态性和虚函数何谓多态性?多态性也是面向对象程序设计方法的一个
此文档下载收益归作者所有