继承71类之间的关系.ppt

上传人:牧羊曲112 文档编号:6332975 上传时间:2023-10-17 格式:PPT 页数:90 大小:816KB
返回 下载 相关 举报
继承71类之间的关系.ppt_第1页
第1页 / 共90页
继承71类之间的关系.ppt_第2页
第2页 / 共90页
继承71类之间的关系.ppt_第3页
第3页 / 共90页
继承71类之间的关系.ppt_第4页
第4页 / 共90页
继承71类之间的关系.ppt_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《继承71类之间的关系.ppt》由会员分享,可在线阅读,更多相关《继承71类之间的关系.ppt(90页珍藏版)》请在三一办公上搜索。

1、第7章 继承,7.1 类之间的关系,7.2 基类和派生类,7.3 基类的初始化,7.4 继承的应用实例,7.5 多继承,小结,7.1 类之间的关系,has-A,uses-A 和 is-Ahas-A 包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系 用类成员表示,即一个类中的数据成员是另一种已经定义的类。uses-A 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。is-A 机制称为“继承”。关系具有传递性,不具有对称性。,7.1 类之间的关系,继承 是类之间定义的一种重要关系 一个 B 类继承A类,或称从类 A 派生类 B类 A 称为基类(父

2、类),类 B 称为派生类(子类),A,C3,B1,B2 的基类,A 的派生类C1,C2,C3 的基类,A 的派生类(单继承)C3的基类,B1,B2 的派生类(多继承),B1 的派生类,类继承关系的语法形式class 派生类名:基类名表 数据成员和成员函数声明;,7.2 基类和派生类,类继承关系的语法形式class 派生类名:基类名表 数据成员和成员函数声明;,7.2 基类和派生类,基类名表 构成访问控制 基类名1,访问控制 基类名2,访问控制 基类名n,类继承关系的语法形式class 派生类名:基类名表 数据成员和成员函数声明;,7.2 基类和派生类,基类名表 构成访问控制 基类名1,访问控制

3、 基类名2,访问控制 基类名n,访问控制 表示派生类对基类的继承方式,使用关键字:public公有继承 private私有继承 protected保护继承,派生类对基类成员的使用,与继承访问控制和基类中成员性质有关公有继承基类的公有成员派生类的公有成员 基类的保护成员派生类的保护成员私有继承 基类的公有成员和保护成员派生类的私有成员保护继承 基类的公有成员和保护成员派生类的保护成员不论哪种方式继承基类,派生类都不能直接使用基类的私有成员,7.2.1 访问控制,7.2.1 访问控制,7.2.1 访问控制,1.公有继承,#includeclass A public:void get_XY()cou

4、t x y;void put_XY()cout h;int get_V()return v;void make_V()make_S();v=get_S()*h;/使用基类成员函数 protected:int h,v;,例7-1 公有继承的测试,7.2.1 访问控制,#includeclass A public:void get_XY()cout x y;void put_XY()cout h;int get_V()return v;void make_V()make_S();v=get_S()*h;/使用基类成员函数 protected:int h,v;,7.2.1 访问控制,例7-1 公有继

5、承的测试,#includeclass A public:void get_XY()cout x y;void put_XY()cout h;int get_V()return v;void make_V()make_S();v=get_S()*h;/使用基类成员函数 protected:int h,v;,保护数据成员在类层次中可见,7.2.1 访问控制,例7-1 公有继承的测试,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.

6、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;,7.2.1 访问控制,例7-1 公有继承的测试,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=ob

7、jB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;,7.2.1 访问控制,例7-1 公有继承的测试,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

8、_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;,x y,7.2.1 访问控制,例7-1 公有继承的测试,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_

9、H();objC.make_V();cout V=objC.get_V()endl;,x y,s,7.2.1 访问控制,例7-1 公有继承的测试,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=o

10、bjC.get_V()endl;,对 objA 的数据成员操作,x y,s,h v,7.2.1 访问控制,例7-1 公有继承的测试,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

11、_V()endl;,调用基类A成员函数对 objB 的数据成员操作,x y,s,h v,7.2.1 访问控制,例7-1 公有继承的测试,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.g

12、et_V()endl;,调用派生类B成员函数对 objB 的数据成员操作,x y,s,h v,7.2.1 访问控制,例7-1 公有继承的测试,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=obj

13、C.get_V()endl;,调用基类A成员函数对 objC 的数据成员操作,x y,s,h v,7.2.1 访问控制,例7-1 公有继承的测试,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=o

14、bjC.get_V()endl;,调用派生类C成员函数对 objC 的数据成员操作,x y,s,h v,7.2.1 访问控制,例7-1 公有继承的测试,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

15、V=objC.get_V()endl;,x y,s,h v,7.2.1 访问控制,例7-1 公有继承的测试,7.2.1 访问控制,2.私有继承,#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_

16、S();cout S=objB.get_S()endl;,例7-2 私有继承的测试1,7.2.1 访问控制,#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.ge

17、t_S()endl;,调用基类成员函数,7.2.1 访问控制,例7-2 私有继承的测试1,#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

18、;,访问私有数据成员,7.2.1 访问控制,例7-2 私有继承的测试1,#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;,7.2.1 访

19、问控制,例7-2 私有继承的测试1,#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;,例7-3 私有继承的测试2,基类的私有数据成员不能在

20、派生类中直接访问但存储空间存在,7.2.1 访问控制,#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;,7.2.1 访问控制,例7-3 私

21、有继承的测试2,#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;,调用构造函数对数据成员赋值,7.2.1 访问控制,例7-3 私有继承的测

22、试2,#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;,创建派生类对象调用基类 派生类构造函数b.x=1 b.y=1,7.2.1 访问控制

23、,例7-3 私有继承的测试2,#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;,调用基类公有成员函数b.x+,7.2.1 访问控制,例7-

24、3 私有继承的测试2,#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;,调用派生类公有成员函数b.y+,7.2.1 访问控制,例7-3 私

25、有继承的测试2,#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;,调用基类版本同名函数返回 b.x 的值,7.2.1 访问控制,例7-3

26、私有继承的测试2,#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;,调用派生类版本同名函数返回 b.y 的值,7.2.1 访问控制,例7-

27、3 私有继承的测试2,7.2.1 访问控制,3.保护继承,派生类定义了与基类同名的成员,在派生类中访问同名成员 时屏蔽了基类的同名成员 在派生类中使用基类的同名成员,显式地使用类名限定符:类名:成员,7.2.2 重名成员,7.2.2 重名成员,例:class base public:int a,b;class derived:public base public:int b,c;void f()derived d;d.a=1;d.base:b=2;d.b=3;d.c=4;,7.2.2 重名成员,1.重名数据成员,base a b,derived a bbc,例:class base publi

28、c:int a,b;class derived:public base public:int b,c;void f()derived d;d.a=1;d.base:b=2;d.b=3;d.c=4;,7.2.2 重名成员,base a b,derived a bbc,使用 derived 类的数据成员a,1.重名数据成员,例:class base public:int a,b;class derived:public base public:int b,c;void f()derived d;d.a=1;d.base:b=2;d.b=3;d.c=4;,7.2.2 重名成员,使用 从base 类继

29、承的 b,base a b,derived a bbc,1.重名数据成员,例:class base public:int a,b;class derived:public base public:int b,c;void f()derived d;d.a=1;d.base:b=2;d.b=3;d.c=4;,7.2.2 重名成员,使用 derived 类的数据成员b,base a b,derived a bbc,1.重名数据成员,例:class base public:int a,b;class derived:public base public:int b,c;void f()derived

30、 d;d.a=1;d.base:b=2;d.b=3;d.c=4;,7.2.2 重名成员,使用 derived 类的数据成员c,base a b,derived a bbc,1.重名数据成员,例:class base public:int a,b;class derived:public base public:int b,c;void f()derived d;d.a=1;d.base:b=2;d.b=3;d.c=4;,7.2.2 重名成员,base a b,derived a bbc,基类成员的作用域延伸到所有派生类派生类的重名成员屏蔽基类的同名成员,1.重名数据成员,/例7-4#inclu

31、declass A public:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b

32、.printAB();,7.2.2 重名成员,2.重名成员函数,void print()cout a1=a1 t a2=a2 endl;,void print()/定义同名函数 cout b1=b1 t b2=b2 endl;,/例7-4#includeclass A public:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定

33、义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b.printAB();,7.2.2 重名成员,2.重名成员函数,void print()cout a1=a1 t a2=a2 endl;,void print()/定义同名函数 cout b1=b1 t b2=b2 endl;,派生类屏蔽基类同名成员函数 调用自身的成员函数,/例7-4#includeclass A public:int a1,a2

34、;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b.printAB();,7.2.2 重名成员,2.重

35、名成员函数,void print()cout a1=a1 t a2=a2 endl;,void print()/定义同名函数 cout b1=b1 t b2=b2 endl;,派生类对象调用从基类继承的同名成员函数,/例7-4#includeclass A public:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数

36、cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b.printAB();,7.2.2 重名成员,2.重名成员函数,void print()cout a1=a1 t a2=a2 endl;,void print()/定义同名函数 cout b1=b1 t b2=b2 endl;,/例7-4#includeclass A public:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=

37、i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b.printAB();,7.2.2 重名成员,2.重名成员函数,/例7-4#includeclass A pub

38、lic:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b.printAB();,7

39、.2.2 重名成员,2.重名成员函数,/例7-4#includeclass A public:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函

40、数;void main()B b;b.A:print();b.printAB();,7.2.2 重名成员,2.重名成员函数,/例7-4#includeclass A public:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print(

41、);/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b.printAB();,7.2.2 重名成员,2.重名成员函数,通过继承,类B具有两个同名成员函数void A:print();void B:print();,/void print(A*this);,/void print(B*this);,/例7-4#includeclass A public:int a1,a2;A(int i1=0,int i2=0)a1=i1;a2=i2;void print()cout a1=a1 t a2=a2 endl

42、;class B:public A public:int b1,b2;B(int j1=1,int j2=1)b1=j1;b2=j2;void print()/定义同名函数 cout b1=b1 t b2=b2 endl;void printAB()A:print();/派生类对象调用基类版本同名成员函数 print();/派生类对象调用自身的成员函数;void main()B b;b.A:print();b.printAB();,7.2.2 重名成员,2.重名成员函数,通过继承,类B具有两个同名成员函数void A:print();void B:print();派生类也是基类,基类指针可以指

43、向 派生类对象 派生类中定义与基类同名的成员函数,称为重载成员函数,/void print(A*this);,/void print(B*this);,7.2.3 派生类中的静态成员,基类定义的静态成员,不受继承方式的影响,在整个类层次 体系中都可以访问 派生类中访问静态成员,必须用以下形式显式说明:类名:成员,7.2.3 派生类中的静态成员,7.2.3 派生类中的静态成员,例:class B public:static void f();void g();class D:private B;class DD:public D void h();void DD:h()B:f();f();g()

44、;,7.2.3 派生类中的静态成员,7.2.3 派生类中的静态成员,例:class B public:static void f();void g();class D:private B;class DD:public D void h();void DD:h()B:f();f();g();,正确,7.2.3 派生类中的静态成员,7.2.3 派生类中的静态成员,例:class B public:static void f();void g();class D:private B;class DD:public D void h();void DD:h()B:f();f();g();,错误,7.

45、2.3 派生类中的静态成员,7.2.3 派生类中的静态成员,例:class B public:static void f();void g();class D:private B;class DD:public D void h();void DD:h()B:f();f();g();,错误它是 D 的私有成员,7.2.3 派生类中的静态成员,7.3 基类的初始化,建立一个类层次后,要创建某个派生类的对象,包括隐含使用基类 的数据和函数 构造函数不被继承。C+提供一种机制,在创建派生类对象时调用基 类的构造函数来初始化基类数据,派生类构造函数声明为派生类构造函数(变元表):基类(变元表),对象成

46、员1(变元表)对象成员n(变元表);构造函数执行顺序:基类 对象成员 派生类,构造函数的调用次序,创建一个派生类的对象时,如果基类带有构造函数,则先调用基类的构造函数,然后才调用派生类的构造函数;派生类对象被撤销时析构函数的调用次序刚好相反,首先调用的是派生类的析构函数,然后才调用基类的析构函数。在多层的类层次中也遵循此规则,构造函数按派生的次序调用,析构函数则按相反次序调用。,/例7-5 调用构造函数顺序测试,构造函数无参数#include class Base public:Base()cout Base created.n;class D_class:public Base public

47、:D_class()cout D_class created.n;void main()D_class d1;,7.3 基类的初始化,/例7-5 调用构造函数顺序测试,构造函数无参数#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;,7.3 基类的初始化,/例7-5 调用构造函数顺序测试,构造函数无参数#include class Base public:Base()

48、cout Base created.n;class D_class:public Base public:D_class()cout D_class created.n;void main()D_class d1;,调用基类构造函数,7.3 基类的初始化,/例7-5 调用构造函数顺序测试,构造函数无参数#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;,调用派生类构造

49、函数,7.3 基类的初始化,析构函数的调用次序,派生类构造函数声明为派生类构造函数(变元表):基类(变元表),对象成员1(变元表)对象成员n(变元表);构造函数执行顺序:基类 对象成员 派生类析构函数的调用次序:派生类对象成员基类 构造函数的调用次序和析构函数的次序相反,#include class aapublic:aa()cout“aa object hello.n”;aa()cout“aa object bye.n”;class bbpublic:bb()cout“bb object hello.n”;bb()cout“bb object bye.n”;void main()bb obj

50、;,#include class aapublic:aa()cout“aa object hello.n”;aa()cout“aa object bye.n”;class bbpublic:bb()cout“bb object hello.n”;bb()cout“bb object bye.n”;void main()bb obj;,程序的运行结果如下:aa object hello.bb object hello.bb object bye.aa object bye.,7.5 多重继承,一个类有多个直接基类的继承关系称为多重继承 多重继承声明语法class 派生类名:访问控制 基类名1,访

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号