资源描述
1 1 1 1、类之间的关系、类之间的关系、类之间的关系、类之间的关系 has-Ahas-A,uses-A uses-A 和和 is-Ais-A has-A(包包含含关关系系),用用以以描描述述一一个个类类由由多多个个“部部件件类类”构构成成。实实现现has-A关关系系用用类类成成员员表表示示,即即一个类中的数据成员是已定义的类。一个类中的数据成员是已定义的类。uses-A(一一个个类类部部分分地地使使用用另另一一个个类类),通通过过类类之之间间成成员员函函数数的的相相互互联联系系,定定义义友友员员或或对对象象参参数数传递实现。传递实现。is-A(继承)。关系具有传递性(继承)。关系具有传递性,不具有对称性。不具有对称性。第1页/共110页1、类之间的关系 has-A,uses-A 和 is-A第1非对称性非对称性:不是所有植物都属于蕨类。:不是所有植物都属于蕨类。传递性:传递性:高等植物、蕨类植物、芒萁都是植物,高等植物、蕨类植物、芒萁都是植物,具有植物的共同特征。具有植物的共同特征。植物 低等植物高等植物藻类菌类地衣类苔藓类蕨类裸子类被子类地钱小金发草毛蕨芒萁杉木柏木荔枝橘子继承关系继承关系继承关系继承关系 第2页/共110页非对称性:不是所有植物都属于蕨类。传递性:高等植物、蕨类植 继承继承 是类之间定义的一种重要关系。是类之间定义的一种重要关系。一个一个 B 类继承类继承A类,或称从类类,或称从类 A 派生类派生类 B 类类 A 称为基类(父类),类称为基类(父类),类 B 称为派生类(子类)称为派生类(子类)B1,B2 的基类A 的派生类C1,C2,C3 的基类A 的派生类(单继承)C3的基类B1,B2 的派生类(多继承)AB1B2C1C2C3B1 的派生类继承关系继承关系继承关系继承关系 第3页/共110页 继承 是类之间定义的一种重要关系。B1,B2 的基类A class person protected:char name10;int age;char sex;public:void print();class employee protected:char name10;int age;char sex;char department20;float salary;public:void print();为什么要用继承?为什么要用继承?第4页/共110页class person class employee 4继承继承:保持已有类的特性而构造新类的过程。保持已有类的特性而构造新类的过程。派生:派生:在已有类的基础上新增自己的特性而产生在已有类的基础上新增自己的特性而产生新类的过程。新类的过程。继承的目的:继承的目的:实现代码重用。实现代码重用。派生的目的:派生的目的:当新的问题出现,原有程序无法解当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行决(或不能完全解决)时,需要对原有程序进行改造。改造。2 2 2 2、派生类的概念、派生类的概念、派生类的概念、派生类的概念 第5页/共110页继承:保持已有类的特性而构造新类的过程。2、派生类的概念 第继承关系的语法形式继承关系的语法形式class 派生类名派生类名:基类名表基类名表 数据成员和成员函数声明数据成员和成员函数声明;派生类的声明派生类的声明派生类的声明派生类的声明 派生类的功能:派生类的功能:可以增加新的数据成员;可以增加新的数据成员;可以增加新的成员函数;可以增加新的成员函数;可以重新定义基类中已有的成员函数;可以重新定义基类中已有的成员函数;可以改变现有成员的属性。可以改变现有成员的属性。第6页/共110页继承关系的语法形式派生类的声明 派生类的功能:第6页/共11基类名表基类名表 构成构成访问控制访问控制 基类名基类名1,访问控制访问控制 基类名基类名2,访问控制访问控制 基类名基类名n访问控制:访问控制:表示派生类对基类的继承方式表示派生类对基类的继承方式 publicpublicpublicpublic公有继承公有继承 privateprivateprivateprivate私有继承私有继承 protectedprotectedprotectedprotected 保护继承保护继承派生类的声明派生类的声明派生类的声明派生类的声明 第7页/共110页基类名表 构成访问控制:表示派生类对基类的继承方式 p派派生生类类对对基基类类成成员员的的使使用用,与与继继承承访访问问控控制制和和基基类中成员性质有关;类中成员性质有关;公有继承公有继承 基类的公有成员基类的公有成员派生类的公有成员派生类的公有成员基类的保护成员基类的保护成员派生类的保护成员派生类的保护成员私有继承私有继承 基类的公有成员和保护成员基类的公有成员和保护成员 派生类的私有成员派生类的私有成员保护继承保护继承 基类的公有成员和保护成员基类的公有成员和保护成员 派生类的保护成员派生类的保护成员不论什么方式继承基类,派生类都不能直接使用不论什么方式继承基类,派生类都不能直接使用基类的私有成员。基类的私有成员。访问控制访问控制第8页/共110页派生类对基类成员的使用,与继承访问控制和基类中成员性质有关;(1 1)公有继承public 成员 public 成员protected 成员 protected 成员private 成员public 成员protected 成员private 成员基类派生类第9页/共110页(1)公有继承public 成员 pu#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:public A public:int get_S()return s;void make_S()s=x*y;/使用基类数据成员 x,y protected:int s;class C:public B public:void get_H()cout h;int get_V()return v;void make_V()make_S();v=get_S()*h;/使用基类成员函数 protected:int h,v;class Aclass C:public Bclass B:public A公有继承的测试 第10页/共110页#includeclass Acl#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;protected:int x,y;class B:public A public:int get_S()return s;void make_S()s=x*y;/使用基类数据成员 x,y protected:int s;protected:int s;class C:public Bpublic:void get_H()cout h;int get_V()return v;void make_V()make_S();v=get_S()*h;/使用基类成员函数 protected:int h,v;protected:int h,v;class Aclass C:public Yclass B:public X保护数据成员在类层次中可见公有继承的测试 第11页/共110页#includeclass Aclvoid main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;公有继承的测试 第12页/共110页void main()公有继承的测试 第12页/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAx y 公有继承的测试 第13页/共110页void main()objA.yobjA.xobjAx void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAx y objB.sobjB.yobjB.xobjBs公有继承的测试 第14页/共110页void main()objA.yobjA.xobjAx void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBx y sobjC.hobjC.vobjC.sobjC.yobjC.xobjCh v 公有继承的测试 第15页/共110页void main()objA.yobjA.xobjAobjvoid main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC对 objA 的数据成员操作x y sh v 公有继承的测试 第16页/共110页void main()objA.yobjA.xobjAobjvoid main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用基类A成员函数对 objB 的数据成员操作x y sh v 公有继承的测试 第17页/共110页void main()objA.yobjA.xobjAobjvoid main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用派生类B成员函数对 objB 的数据成员操作x y sh v 公有继承的测试 第18页/共110页void main()objA.yobjA.xobjAobjvoid main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用基类A成员函数对 objC 的数据成员操作x y sh v 公有继承的测试 第19页/共110页void main()objA.yobjA.xobjAobjvoid main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用派生类C成员函数对 objC 的数据成员操作x y sh v 公有继承的测试 第20页/共110页void main()objA.yobjA.xobjAobjvoid main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjCx y sh v 公有继承的测试 第21页/共110页void main()objA.yobjA.xobjAobjpublic 成员protected 成员private 成员public 成员protected 成员private 成员基类派生类private 成员private 成员(2 2)私有继承第22页/共110页public 成员protected 成员private 成#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:private A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;私有继承的测试 class B:private Aclass A objB.sobjB.yobjB.xobjBprivate成员第23页/共110页#include私有继承的测试 cl#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:private A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;class B:private Aclass A 调用基类成员函数objB.sobjB.yobjB.xobjBprivate成员私有继承的测试 第24页/共110页#includeclass B:#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:private A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;class B:private Aclass A 访问私有数据成员objB.sobjB.yobjB.xobjBprivate成员私有继承的测试 第25页/共110页#includeclass B:#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:private A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;class B:private Aclass A objB.sobjB.yobjB.xobjBprivate成员私有继承的测试 第26页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;B b;b.addX();b.addY();cout a.x=a.out()endl;cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 基类的私有数据成员基类的私有数据成员不能在派生类中直接访问不能在派生类中直接访问但派生类对象建立私有数据空间但派生类对象建立私有数据空间 b.xa.xb.y私有继承的测试 第27页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A b.xa.xb.y私有继承的测试 第28页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用构造函数调用构造函数对数据成员赋值对数据成员赋值1b.xa.xb.y私有继承的测试 第29页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 创建派生类对象调用基类 派生类构造函数b.x=1 b.y=1111 1b.xa.xb.y私有继承的测试 第30页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用基类公有成员函数b.x+112 2b.xa.xb.y私有继承的测试 第31页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用派生类公有成员函数b.y+122 2b.xa.xb.y私有继承的测试 第32页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用基类版本同名函数返回 b.x 的值122 2b.xa.xb.y私有继承的测试 第33页/共110页#includeclass B:#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用派生类版本同名函数返回 b.y 的值122 2b.xa.xb.y私有继承的测试 第34页/共110页#includeclass B:public 成员protected 成员private 成员public 成员protected 成员private 成员基类派生类protected 成员protected 成员(3 3)保护继承第35页/共110页public 成员protected 成员private 成3 3、派生类的构造函数和析构函数、派生类的构造函数和析构函数基类的构造函数和析构函数都不被继承,需基类的构造函数和析构函数都不被继承,需要在派生类中重新定义。由于派生类继承了要在派生类中重新定义。由于派生类继承了基类的成员,在初始化时,要同时初始化基基类的成员,在初始化时,要同时初始化基类成员。类成员。声明派生类构造函数时,除了需要对本类中声明派生类构造函数时,除了需要对本类中新增成员进行初始化外,还要对基类成员初新增成员进行初始化外,还要对基类成员初始化。始化。第36页/共110页3、派生类的构造函数和析构函数基类的构造函数和析构函数都不被36派生类的构造函数派生类的构造函数派生类构造函数声明的一般语法形式如下:派生类构造函数声明的一般语法形式如下::(参数总表参数总表):):基类名基类名1(1(参数表参数表1)1),.,基类名,基类名n(n(参数表参数表n)n),内嵌对象名内嵌对象名1(1(内嵌对象参数表内嵌对象参数表1)1),.,内嵌对象名内嵌对象名m(m(内嵌对象参数表内嵌对象参数表m)m)派生类新增成员的初始化语句;派生类新增成员的初始化语句;第37页/共110页派生类的构造函数派生类构造函数声明的一般语法形式如下:第3737派生类的构造函数派生类的构造函数其中:其中:派生类的构造函数名与派生类名相同。派生类的构造函数名与派生类名相同。参数总表需要列出初始化基类数据、新增内嵌对参数总表需要列出初始化基类数据、新增内嵌对象数据及新增一般成员数据所需要的全部参数。象数据及新增一般成员数据所需要的全部参数。冒号之后,列出需要使用参数进行初始化的基类冒号之后,列出需要使用参数进行初始化的基类名和内嵌成员名及各自的参数表,各项之间用逗名和内嵌成员名及各自的参数表,各项之间用逗号分隔。号分隔。第38页/共110页派生类的构造函数其中:第38页/共110页38派生类构造函数的执行顺序:派生类构造函数的执行顺序:(1)先调用基类的构造函数;)先调用基类的构造函数;(2)然后按照数据成员的声明顺序,依次调用数)然后按照数据成员的声明顺序,依次调用数据成员的构造函数;据成员的构造函数;(3)最后执行派生类构造函数的函数体。)最后执行派生类构造函数的函数体。注意:注意:构造函数的执行顺序只与成员声明的顺序有构造函数的执行顺序只与成员声明的顺序有关,而与初始化表中各项的排列顺序无关。关,而与初始化表中各项的排列顺序无关。常量常量成员、引用成员、内嵌对象,只能通过初始化表的方成员、引用成员、内嵌对象,只能通过初始化表的方法初始化。法初始化。派生类的构造函数派生类的构造函数基类基类 对象成员对象成员 派生类派生类第39页/共110页派生类构造函数的执行顺序:派生类的构造函数基类 对象成员39 析构函数也不被继承,派生类自行声明。声明方析构函数也不被继承,派生类自行声明。声明方法与一般(无继承关系时)类的析构函数相同。法与一般(无继承关系时)类的析构函数相同。派生类析构函数执行时将自动调用基类及内嵌对派生类析构函数执行时将自动调用基类及内嵌对象的析构函数,系统会自动隐式调用,因此不必象的析构函数,系统会自动隐式调用,因此不必显式调用。显式调用。析构函数的调用次序与构造函数相反。析构函数的调用次序与构造函数相反。派生类的析构函数派生类的析构函数第40页/共110页 析构函数也不被继承,派生类自行声明。声明方法与一般(无继承40/构造函数调用顺序测试,构造函数无参数#include class Base public:Base()cout Base created.n;class D_class:public Base public:D_class()cout D_class created.n;void main()D_class d1;调用基类构造函数第41页/共110页/构造函数调用顺序测试,构造函数无参数 调用基类构造函数/构造函数调用顺序测试,构造函数无参数#include class Base public:Base()cout Base created.n;class D_class:public Base public:D_class()cout D_class created.n;void main()D_class d1;调用派生类构造函数第42页/共110页/构造函数调用顺序测试,构造函数无参数 调用派生类构造#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();带参数构造函数调用顺序测试第43页/共110页#include 带参数构造函数调用#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();int data1,data2;int data3;parent_class data4;data1data2 data4data1data2data3parent_classderived_classdata1data2带参数构造函数调用顺序测试第44页/共110页#include int data带参数构造函数调用顺序测试#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display()coutdata1=data1,data2=data2endl;基类有一个带参数的构造函数data1data1data2data2 data4data1data2data3parent_classderived_classdata1data2第45页/共110页带参数构造函数调用顺序测试#include iostrea带参数构造函数调用顺序测试#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display()coutdata1=data1,data2=data2endl;成员函数数据成员自增data1data1data2data2 data4data1data2data3parent_classderived_classdata1data2第46页/共110页带参数构造函数调用顺序测试#include iostrea#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;data1data2 data4data1data2data3parent_classderived_classdata1data2带参数构造函数调用顺序测试第47页/共110页#include class de#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;类成员data1data2 data4data4data1data1data2data2data3parent_classderived_classdata1data2带参数构造函数调用顺序测试第48页/共110页#include class de带参数构造函数调用顺序测试#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;派生类构造函数有5个参数data1data2 data4data1data2data3parent_classderived_classdata1data2第49页/共110页带参数构造函数调用顺序测试#include iostrea#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2)parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();dat
展开阅读全文