《一组合二继承和派生三派生类的声明和对象定义》由会员分享,可在线阅读,更多相关《一组合二继承和派生三派生类的声明和对象定义(26页珍藏版)》请在金锄头文库上搜索。
1、C/C+程序设计程序设计一、组一、组 合合二、继承和派生二、继承和派生三、派生类的声明和对象定义三、派生类的声明和对象定义阵释卓枕罢壶嘲宪陛跟坦跃殃积罗娘企吗纷峨镍宗恋病姚烬肩诌掷刹颤铰一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义1C/C+程序设计程序设计一、组一、组 合合1. 组合的概念组合的概念 C+中组合是指结构和类的声明嵌入结构变量或对象作中组合是指结构和类的声明嵌入结构变量或对象作为其成员的现象。嵌入的对象成员亦称为成员对象,包容这为其成员的现象。嵌入的对象成员亦称为成员对象,包容这个成员对象的类可称为组合类或包容类。个成员对象的类可称为组合类
2、或包容类。 当构造一个组合类的对象时,系统首先为每一个数据成当构造一个组合类的对象时,系统首先为每一个数据成员分配内存空间,仅当其中的成员对象获得完备的内存时才员分配内存空间,仅当其中的成员对象获得完备的内存时才导致组合类实例的诞生。导致组合类实例的诞生。 编译器先调用嵌入对象的构造函数,然后调用组合类的编译器先调用嵌入对象的构造函数,然后调用组合类的构造函数。构造函数。 娘捅眨商判熙园桅傻丧峨盼育誓蓟床套侄员醒族蝴瘪栈啊猴宾藻环机靖倒一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义2C/C+程序设计程序设计 嵌入对象所隶属的类或嵌入类对应既定的事物,组合类
3、嵌入对象所隶属的类或嵌入类对应既定的事物,组合类对应某种新生的事物。对应某种新生的事物。 C+中一个重要的思想是先构造既定的对象,然后构造中一个重要的思想是先构造既定的对象,然后构造新生的对象。新生的对象。 这也适应继承的情况,先构造基类再构造派生类。但析这也适应继承的情况,先构造基类再构造派生类。但析构的次序与构造相反,先诞生的对象后撤离内存空间。构的次序与构造相反,先诞生的对象后撤离内存空间。 对象的构造和析构遵循堆栈空间先进后出的原理。对象的构造和析构遵循堆栈空间先进后出的原理。 鄙境所率们灵缓于突辞家撵噪羽整逃勤取疡荐若闽汲酷拢玛养毖灾祸糙难一组合二继承和派生三派生类的声明和对象定义一
4、组合二继承和派生三派生类的声明和对象定义3C/C+程序设计程序设计2. 引用型成员和引用型成员和const成员成员 类中允许存在引用型数据成员和类中允许存在引用型数据成员和const数据成员。引用数据成员。引用应依附于另一个独立的变量,等待及时的初始化。应依附于另一个独立的变量,等待及时的初始化。Const数数据成员是仅仅初始化一次其值便不再改变的数据成员。据成员是仅仅初始化一次其值便不再改变的数据成员。 对于存在对于存在const型的不变成员或引用型成员,系统提供型的不变成员或引用型成员,系统提供的缺省的赋值运算符函数不起作用。引用型成员和不变成员的缺省的赋值运算符函数不起作用。引用型成员和
5、不变成员只能借助冒号语法初始化。只能借助冒号语法初始化。恐咐赣邓垃财抛粒蹦窘盎惦史蔗玉跺取峭寿惩异厉蜒蜂虾渣羽公燎墅忍圃一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义4C/C+程序设计程序设计 当基于内存数据共享而设置引用型成员的时候,应注意当基于内存数据共享而设置引用型成员的时候,应注意引用型成员应关联到一个具有独立的生存期长或等长的同类引用型成员应关联到一个具有独立的生存期长或等长的同类型变量。型变量。 具有具有const成员的对象预埋一个不变的成员,这样的类成员的对象预埋一个不变的成员,这样的类是一个奇怪的类,因此编编程时应仔细加以处理。是一个奇怪的
6、类,因此编编程时应仔细加以处理。 下面的例子为简单见嵌入一个内置下面的例子为简单见嵌入一个内置int类型的引用型成类型的引用型成员和不变成员,通过该例说明构造函数初始化列表的语法格员和不变成员,通过该例说明构造函数初始化列表的语法格式。式。 缩愤属误壮惺壁勉莱况涅溯迁澈破隐奎盖颁敝贺熊蒂媒匙灭纲扮冈匙舷甲一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义5C/C+程序设计程序设计例例 CType内含内含int类型的引用型成员和类型的引用型成员和const成员成员#include static int numc=0;class CType public: CTy
7、pe (int x=1,int y=2); CType:CType (); private: int n; const int c; public: int& r; CType:CType() printf (%d.n=%d,r=%d CType:CType();, numc-,n,r); 至我包臼货恋叶织钡于植殃翁备宅仪跪窒瓦填犹塔愧撼列耘汽氰凝斡宅谋一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义6C/C+程序设计程序设计CType:CType (int x,int y) :r(y), c(x) n=x; printf (%d. n=%d,r=%d CT
8、ype (int,int);, +numc,n,r); CType g; void main() printf (Enter into main()n);CType x (3,4); printf (x.r=%dn,x.r); printf (Go outof main() n);保坐禾滥魔滔酿跨葛仙吠押怀卒员娱中置焙正丛有躬哼取僵建滓蜂苔幂吕一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义7C/C+程序设计程序设计 /程序运行输出结果:程序运行输出结果: 1. n=1,r=2 CType(int,int);Enter into main() 2. n=3,
9、r=4 CType(int,int);x.r=4 2. n=3,r=4199100 CType:CType();Go outof main() 1. n=1,r=-858993460 CType:CType(); 此题输出一个不可靠的结果。原因在于:此题输出一个不可靠的结果。原因在于: y是一个函数入口堆栈空间的局部变量,是一个函数入口堆栈空间的局部变量,r是一个生存期是一个生存期由对象控制的引用型成员。由对象控制的引用型成员。 将引用型成员关联到生存期短的局部变量是危险的。将引用型成员关联到生存期短的局部变量是危险的。巾播咖题奉慎郸狞顷俘寓祥滞柑仁舞欢痪攀寓屿似知犬爆注伎死被橱曳插一组合二继
10、承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义8C/C+程序设计程序设计3. 嵌入对象的初始化嵌入对象的初始化 嵌入对象所属类最好存在显式或隐含的可访问的缺省构嵌入对象所属类最好存在显式或隐含的可访问的缺省构造函数,从而可被编译器自动隐含调用。下面的规则描述嵌造函数,从而可被编译器自动隐含调用。下面的规则描述嵌入对象显式的初始化:入对象显式的初始化: a.组合类的构造函数显式调用嵌入对象自身的带参构组合类的构造函数显式调用嵌入对象自身的带参构造函数,这一调用是通过冒号初始化语法进行的。造函数,这一调用是通过冒号初始化语法进行的。 b. 嵌入对象按照其在组合类中的声明
11、次序调用自身的嵌入对象按照其在组合类中的声明次序调用自身的构造函数,而不是冒号语法列表中出现的次序。构造函数,而不是冒号语法列表中出现的次序。 c. 嵌入对象的构造函数对于组合类是可访问的,可访嵌入对象的构造函数对于组合类是可访问的,可访问的含义是或者嵌入对象的构造函数是公共的,或者组合类问的含义是或者嵌入对象的构造函数是公共的,或者组合类声明为嵌入类的友员类等。声明为嵌入类的友员类等。幅拧印往皂驾抢氨站鄂央馏那肪企锰痴冀聘腺慌费卫烛擞幢米门棉猛讶竣一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义9C/C+程序设计程序设计例例 嵌入类和组合类的对象生灭嵌入类
12、和组合类的对象生灭 #include static int num=0; class CEmbed public: int n; CEmbed (int ,int ); private: int& m_r; ; CEmbed:CEmbed (int x, int y) :m_r (n) n =x; printf (%d.n=%d, CEmbed (int,int) ;,+num, n); 捡疲颁肉耪仁萨挡辆龋慰淄铲絮尉悟鞍孵矽尹匀渗芝现沤币新骸咬支凿沾一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义10C/C+程序设计程序设计 class CContain
13、public:CEmbed a; CContain (int x=1,int y=2); private: const CEmbed b; ; CContain:CContain(int x,int y):b(y,y),a(x,x) printf (%d.a=%d, b=%d, CContain (int,int); n,+num, a.n,b.n); void main() CContain z (3,4); /输出输出: 1. n=3, CEmbed(int,int); 2. n=4, CEmbed(int,int); 3.a=3,b=4, CContain(int,int);乡潦投佬凛绰
14、师牛斗咎环厕猿贬蛛渤檬荡壤呀右朝乎巾霹脏酵哉岁庞锋呸一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义11C/C+程序设计程序设计4. 冒号初始化语法冒号初始化语法 冒号初始化是对象定义时调用构造函数进行初始化的一冒号初始化是对象定义时调用构造函数进行初始化的一种方式种方式 。构造函数冒号初始化语法的一般格式为:。构造函数冒号初始化语法的一般格式为: 类名类名:类名类名(形参列表形参列表):引用型成员引用型成员(左值左值), 嵌入对象嵌入对象(实参列表实参列表),const型成员型成员(右值右值),. 其它成员初始化其它成员初始化; 例如:例如: CEmbed
15、 (int x, int y): m_r (n) . CContain (int x,int y):a (x,x),b (y,y) .泅曳湛李咖氰鄂愧业钉优摇淖念薪串灼抢暴哟脓换盈侩啃庶切尾豺塘凶癌一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义12C/C+程序设计程序设计 该语法的格式是在类的构造函数表题头后紧跟冒号该语法的格式是在类的构造函数表题头后紧跟冒号“:”,冒号之后是成员对象的构造函数初始化调用列表,冒号之后是成员对象的构造函数初始化调用列表,各各列表分项之间以逗号分隔,但不构成先后求值的语义。列表分项之间以逗号分隔,但不构成先后求值的语义。 每
16、一个嵌入成员对象采用函数对象名语法显式调用自身每一个嵌入成员对象采用函数对象名语法显式调用自身的构造函数,对于简单变量也采用构造函数的形式,不采用的构造函数,对于简单变量也采用构造函数的形式,不采用等号形式的初始化。等号形式的初始化。 冒号之后的列表全部省略时对应编译器隐含调用成员对冒号之后的列表全部省略时对应编译器隐含调用成员对象可访问的缺省构造函数,这是编译器的默认设置。象可访问的缺省构造函数,这是编译器的默认设置。 构造函数中形参作用域始于冒号处止于最后一个右花括构造函数中形参作用域始于冒号处止于最后一个右花括号。号。 因此可以采用形参或其它的全局名称初始化嵌入对象、因此可以采用形参或其
17、它的全局名称初始化嵌入对象、引用型成员或引用型成员或const型数据成员。型数据成员。掺甚纬怜冶穿侥旭咬列络满批还浸盾往涧裸绢孙董缸综露搽姓患玲卷员序一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义13C/C+程序设计程序设计 冒号初始化语法原本是为成员对象,引用型成员或冒号初始化语法原本是为成员对象,引用型成员或const数据成员设置的,但对于其它的成员变量也可以从构数据成员设置的,但对于其它的成员变量也可以从构造函数体迁移至冒号后,造函数体迁移至冒号后,如将:如将: CEmbed:CEmbed (int x, int y) : m_r(n) n=x; 变
18、为:变为: CEmbed:CEmbed (int x, int y) : m_r(m) , n(x) 变量成员模拟构造函数变量成员模拟构造函数n(x)形式进行初始赋值。形式进行初始赋值。 m_r(n)建立引用名和变量名的关联,建立引用名和变量名的关联,m_r是相对独立是相对独立的成员变量的成员变量n的别名。的别名。稚湘鸡族靳念粗绰峰两森莆势话居岿膊教枯戮孽绍佐参蚊定典骂壹厨项离一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义14C/C+程序设计程序设计二、继承和派生二、继承和派生1. 继承的概念继承的概念 继承是将已有的数据结构和算法加以接纳融为自身的一继承
19、是将已有的数据结构和算法加以接纳融为自身的一部分,派生是将新的成果连结于原来的知识体系中。继承和部分,派生是将新的成果连结于原来的知识体系中。继承和派生是承上启下的一个联系过程,原来的数据结构和算法对派生是承上启下的一个联系过程,原来的数据结构和算法对应基类,连结于基类的新的数据结构和算法构成派生类,由应基类,连结于基类的新的数据结构和算法构成派生类,由此形成继承树层次体系。此形成继承树层次体系。 继承是面向对象理论程序设计中一种重要的机制,继承继承是面向对象理论程序设计中一种重要的机制,继承面向事物动态的发展,也是人认识自然的一个写照。人首先面向事物动态的发展,也是人认识自然的一个写照。人首
20、先直面的是简单的自然现象,把这些简单现象以文字记录下来直面的是简单的自然现象,把这些简单现象以文字记录下来就形成基本规律的总结。就形成基本规律的总结。耪硒馆衷涵湘螟娩茧俐靠欣托签朴赔灭成懂公口小珍靳下叁狼蓝紊告搀揍一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义15C/C+程序设计程序设计 对于程序员而言是建立一个基本的类。随着对自然现象对于程序员而言是建立一个基本的类。随着对自然现象的深入研究和广泛的积累,各种学科流派相应的应运而生。的深入研究和广泛的积累,各种学科流派相应的应运而生。对于跟踪模拟这些流派动态发展的程序员而言,相应建立各对于跟踪模拟这些流派
21、动态发展的程序员而言,相应建立各种各样的派生类,而无须另起炉灶。种各样的派生类,而无须另起炉灶。 知识的每一积累,对应类的一个扩展。古老的经验沉积知识的每一积累,对应类的一个扩展。古老的经验沉积在基类的数据结构和算法中,时髦的思潮注册在最近派生的在基类的数据结构和算法中,时髦的思潮注册在最近派生的类中。编译器优先利用最近成果的思想,优先使用派生类中类中。编译器优先利用最近成果的思想,优先使用派生类中的资源信息。这是面向对象理论为程序员提供的一种总体策的资源信息。这是面向对象理论为程序员提供的一种总体策划和具体实施纲领。划和具体实施纲领。 这其中的优点是程序的开发和课题的突破可以同步协调这其中的
22、优点是程序的开发和课题的突破可以同步协调的前进,而不必从零出发。的前进,而不必从零出发。巴九辩慨腾汹蔷望舟犀彰驯圣申驹孕奔存官蠕养吵瓦爽张壹酷者刹威蹿席一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义16C/C+程序设计程序设计 基于历史的原因和书写的习惯,继承树层次体系将基类基于历史的原因和书写的习惯,继承树层次体系将基类画在上面,派生类则画在基类的下面。画在上面,派生类则画在基类的下面。 基类也有称为父类的,派生类亦有称为子类的。基类也有称为父类的,派生类亦有称为子类的。 父类和子类的称谓容易构成误解。因此本书不用或废弃父类和子类的称谓容易构成误解。因此
23、本书不用或废弃模糊的父类和子类的称谓。模糊的父类和子类的称谓。 C+语言允许继承和派生出现多对一、一对多的关系。语言允许继承和派生出现多对一、一对多的关系。 一个基类可以拥有多个派生类,这样的基类在程序设计一个基类可以拥有多个派生类,这样的基类在程序设计中的地位举足轻重,一个派生类可以同时拥有多个基类。如中的地位举足轻重,一个派生类可以同时拥有多个基类。如果一个派生类上逆时只有一个基类,称为单继承层次体系。果一个派生类上逆时只有一个基类,称为单继承层次体系。 如果一个派生类上逆时存在两个以上的基类,称为多继如果一个派生类上逆时存在两个以上的基类,称为多继承层次体系。承层次体系。 MFC类库是单
24、继承体系。类库是单继承体系。iostream类是多继类是多继承体系。承体系。叹墙服吐皑弧惠痢窖邀粟德舅长盂鹊跌蒙称赠市唤亏俊五韶享漏范甄遭门一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义17C/C+程序设计程序设计 CObjectCCmdTarget CWinAppCUserDocCDocumentCWinThread CWndCUserApp CViewCFrameWnd CDialogCUserViewCUserDialogCMainFrame 图图 MFC关键类的层次体系关键类的层次体系签罐薛挪偶乳碾俊份淮赵憨硫随招惭扫鲤锣存腥镰休帖背魄情悉邪更快氦
25、一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义18C/C+程序设计程序设计2. 间接基类和间接派生类间接基类和间接派生类 直接基类就是直接出现于类声明的基类表中的类。一个直接基类就是直接出现于类声明的基类表中的类。一个类都可以候选为基类,也可以作为派生类连结到另外一个既类都可以候选为基类,也可以作为派生类连结到另外一个既定的类上,一个类既是另外一个类的基类本身又是上层类的定的类上,一个类既是另外一个类的基类本身又是上层类的派生类,由此形成复杂的类层次体系。派生类,由此形成复杂的类层次体系。 如如CWnd上有直接基类上有直接基类CCmdTarget,间接基类
26、,间接基类CObject,下有直接派生类,下有直接派生类 CView,更等待用户间接派生的,更等待用户间接派生的类类CUserView。 C+ 语言不允许上面的语言不允许上面的(间接间接)基类成为基类成为(间接间接)派生类派生类的的派生类,也就是禁止数据结构中环的出现。这样继承和派生派生类,也就是禁止数据结构中环的出现。这样继承和派生就是一个有向无环图。就是一个有向无环图。 龚瞪吭判耪垦喘魂朵体洲镇荒敖卢尽肚凿幕俏圣遥竞蔗由羞骋匙逗叠欧踩一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义19C/C+程序设计程序设计三、派生类的声明和对象定义三、派生类的声明和对
27、象定义 对于一个特定的演化断面,设若干基类已经适当的构对于一个特定的演化断面,设若干基类已经适当的构建,则新类追加于这些基类的声明格式分为两种形式:建,则新类追加于这些基类的声明格式分为两种形式: 一种是单继承,一种是多继承一种是单继承,一种是多继承 这里给出单继承方式的声明格式:这里给出单继承方式的声明格式: class CDerived:继承方式:继承方式 CBase CDerived 类的成员声明语句类的成员声明语句; ; class 派生类名:继承方式派生类名:继承方式 直接基类名直接基类名 派生类的成员声明语句派生类的成员声明语句; ;菲锯拐后刀蝉硝芒晾愧尖暂伎品地秩兹腰苑戮耳膨帘细
28、犀撇校葱勉决祝驮一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义20C/C+程序设计程序设计 其中派生类名其中派生类名CDerived是用户新引入的类名,是用户新引入的类名,CBase是已经建立的类名,作为派生类的直接基类名,冒号表现一是已经建立的类名,作为派生类的直接基类名,冒号表现一种承前启后的方式。种承前启后的方式。 通过这种方式用户定义的类可插入到已经存在的类族体通过这种方式用户定义的类可插入到已经存在的类族体系。派生类的成员包括继承的成员和新增加的成员,成员的系。派生类的成员包括继承的成员和新增加的成员,成员的访问属性只有三种,优先由类声明内的访问
29、属性只有三种,优先由类声明内的 private,public,protected明显确定,继承的成员可由继承方式隐含确定。明显确定,继承的成员可由继承方式隐含确定。 继承方式由关键字继承方式由关键字private,public,protected给出。给出。篓伊丁扎弱疾筋质博化注量屡柜卤柄濒丫菠溢锈罪幕温合熟揽浪捎予桅蒙一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义21C/C+程序设计程序设计单继承略微具体的格式为:单继承略微具体的格式为:class CBase public: float m_t1; void f3(); protected:int m_
30、t2; ;class CDerived: public /* protected , private */ CBase /类声明内的类声明内的private,public,protected屏蔽继承方式屏蔽继承方式 /对访问控制的影响对访问控制的影响 public: 公共成员声明语句公共成员声明语句; CBase: m_t2; 基类名基类名:基类非私有的成员名基类非私有的成员名2; protected: 保护成员声明语句保护成员声明语句; 狠月残闯营衣钉樊啪垄辫赛嚼么以辑庚庆簧泛奥笺惰剿亩踞卿难兵辨磅嚼一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义22C/
31、C+程序设计程序设计 CBase: m_t1; 基类名基类名:基类非私有的成员名基类非私有的成员名1;private: 私有成员声明语句私有成员声明语句;CBase: f3; 基类名基类名:基类非私有的成员名基类非私有的成员名3; ; / 不将基类中不将基类中private:冒号界定的私有成员在派生类中冒号界定的私有成员在派生类中 /界定为其它的属性界定为其它的属性 襄当僚耀挡纵迈现祝塑份菩猫瘟浪含包账劝碍竟破田箔堤威搞诞遁寺纫锑一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义23C/C+程序设计程序设计 派生类声明之后就可以用其类名定义对象,格式和基类派生
32、类声明之后就可以用其类名定义对象,格式和基类对象定义一致。对象定义一致。 基类的对象和派生类的对象是不同的对象,拥有独立的基类的对象和派生类的对象是不同的对象,拥有独立的内存空间。内存空间。 如果结构派生于基类则如果结构派生于基类则public是其默认的继承方是其默认的继承方式;而类从基类派生出来,式;而类从基类派生出来,private是其缺省的继承方式。是其缺省的继承方式。 具体含义为:具体含义为: class CDerived: CBase.; 等价于等价于 class CDerived: private CBase . ; struct CDerived: CBase .; 等价于等价于
33、 struct CDerived: public CBase . ;衣妒宗郡乖郊闭胁婶躯姆柒门艘订租刚爱纯聚窜岂撰括题刁卵折刑众逐盈一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义24C/C+程序设计程序设计 派生类的数据集合包含基类声明中的一个子集合。派生类的数据集合包含基类声明中的一个子集合。 这个子集合这个子集合subobject许多书籍中称为子对象,嵌入对许多书籍中称为子对象,嵌入对象也称为子对象。本课件将基类部分构成的子集合称为派生象也称为子对象。本课件将基类部分构成的子集合称为派生类的基部对象,类的基部对象,(派生派生)类的实例为完整对象。类的实
34、例为完整对象。 基部对象是不独立存在的,可以将其单独提取出来赋给基部对象是不独立存在的,可以将其单独提取出来赋给基类的完整对象或基类的对象引用,基类的对象引用就成为基类的完整对象或基类的对象引用,基类的对象引用就成为派生类中的派生类中的subobject的替身。的替身。 瀑惩培簿柠羊蒜堂重兴肢横汕竭捐驶推荒冰疲深拘师斋拓赡吧匪狡熏狡砧一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义25C/C+程序设计程序设计联顷摇亿锚癣需甸雁受谱深听植势洽惠熏的栋肄饰厕惧刨闺蚂勿麻掺编吱一组合二继承和派生三派生类的声明和对象定义一组合二继承和派生三派生类的声明和对象定义26