《C语言程序设计课件第8章-继承和派生.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第8章-继承和派生.ppt(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第8 8章章 继承和派生继承和派生 在在C+C+中可重用性是通过继承中可重用性是通过继承(inheritance)(inheritance)这一这一机制来实现的。继承是机制来实现的。继承是C+C+的一个重要组成部分。的一个重要组成部分。8.1 8.1 继承和派生的概念继承和派生的概念 在在C+C+中,所谓中,所谓“继承继承”就是在一个已存在的类的基础上建就是在一个已存在的类的基础上建立一个新的类。一个新类从已有的类那里获得其已有特性,立一个新的类。一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。通过继承,一个新建子类从已有的这种现象称为类的继承。通过继承,一个新建子类从已有的父类
2、那里获得父类的特性。从另一角度说,从已有的类父类那里获得父类的特性。从另一角度说,从已有的类(父父类类)产生一个新的子类,称为类的派生。类的继承是用已有产生一个新的子类,称为类的派生。类的继承是用已有的类来建立专用类的编程技术。的类来建立专用类的编程技术。8.1.1基类与派生类基类与派生类 1.继承与派生继承与派生交通工具交通工具飞机飞机滑翔机滑翔机直升飞机直升飞机喷气式飞机喷气式飞机交通工具交通工具飞机飞机滑翔机滑翔机直升飞机直升飞机喷气式飞机喷气式飞机已存在的类已存在的类(例如例如“交通工具交通工具”)”)称为称为“基类基类”或或“父类父类”。新建立的类新建立的类(例如例如“飞机飞机”)”
3、)称为称为“派生类派生类”或或“子类子类”。一个基类可以派生出多个派生类,每一个派生类又可以作一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对为基类再派生出新的派生类,因此基类和派生类是相对而言的。而言的。2.基类与派生类基类与派生类 请注意图中箭头的方向,在本书中约定,箭头表示请注意图中箭头的方向,在本书中约定,箭头表示继承的方向,从派生类指向基类。继承的方向,从派生类指向基类。8.1.28.1.2继承与派生的作用继承与派生的作用 1.1.避免公用代码的重复开发,在减少代码和数据冗余的同时,避免公用代码的重复开发,在减少代码和数据冗余的同时,
4、节省程序开发的时间,提高程序开发的效率和质量。节省程序开发的时间,提高程序开发的效率和质量。2.2.通过增强代码一致性来减少模块间的接口和界面。通过增强代码一致性来减少模块间的接口和界面。3.3.通过层次关系来组织对象,使得高层类作为低层类的抽象,通过层次关系来组织对象,使得高层类作为低层类的抽象,有利于程序员掌握对象的共性有利于程序员掌握对象的共性,在此基础上,就能更快地掌握低层在此基础上,就能更快地掌握低层类中的个性特征,给编程与代码重用带来方便。类中的个性特征,给编程与代码重用带来方便。8.1.38.1.3派生类的声明派生类的声明 声明一个派生类的一般格式为:声明一个派生类的一般格式为:
5、class class 派生类名派生类名:派生存取说明符(可省)派生存取说明符(可省)基类名基类名/派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数;派生类名派生类名”是要从基类派生出的新类的名字,是要从基类派生出的新类的名字,“基类名基类名”是一个是一个已经定义好的基类的名字,已经定义好的基类的名字,“派生存取说明符派生存取说明符”可以是关键字可以是关键字publicpublic或或protectedprotected或或privateprivate,派生存取说明符的作用会在后面,派生存取说明符的作用会在后面详细介绍,详细介绍,“派生存取说明符派生存取说明符”可以省略,默认为可以
6、省略,默认为privateprivate,即私有派生。即私有派生。/定义一个基类(定义一个基类(StudentStudent类)类)class Studentclass Student public:public:char name10;/char name10;/姓名姓名 int age;int age;/年龄年龄 char sex;char sex;/性别性别 char classname20;char classname20;/班级名称班级名称;/定义一个派生类(定义一个派生类(GraduateStudentGraduateStudent类)类)class GraduateStudent
7、:public Studentclass GraduateStudent:public Student public:public:char Advisorname10;/char Advisorname10;/导师导师int qualifiergrade;int qualifiergrade;/资格考试分资格考试分;8.2 8.2 派生类成员的访问控制派生类成员的访问控制 8.2.18.2.1派生类成员访问控制简介派生类成员访问控制简介从一个基类派生出一个子类时,可以通过指定派生时的存取从一个基类派生出一个子类时,可以通过指定派生时的存取说明符来实现对派生类成员的访问控制。说明符来实现对派生
8、类成员的访问控制。既然派生类中包含基类成员和派生类自己增加的成员,就既然派生类中包含基类成员和派生类自己增加的成员,就产生了这两部分成员的关系和访问属性的问题。在建立派产生了这两部分成员的关系和访问属性的问题。在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公生类的私有成员,把基类的公用成员直接作为派生类的公用成员。实际上,对基类成员和派生类自己增加的成员是用成员。实际上,对基类成员和派生类自己增加的成员是按不同的原则处理的。按不同的原则处理的。8.2.2 private8.2.2 pr
9、ivate、protectedprotected与与publicpublic类成员类成员 1.private1.private类成员类成员 一个类中的私有(一个类中的私有(privateprivate)成员(包括数据成员和成员函数)成员(包括数据成员和成员函数)只能被它们所在类的成员函数和友元函数访问,在只能被它们所在类的成员函数和友元函数访问,在C+C+中类成员中类成员存取说明符缺省的情况下的存取特征都是私有的(存取说明符缺省的情况下的存取特征都是私有的(privateprivate)。)。【例【例8.18.1】类私有成员的定义和访问类私有成员的定义和访问#include#include c
10、lass Personclass Person /Person/Person类的三个私有成员类的三个私有成员 char name10;/char name10;/姓名姓名private:private:int age;int age;/年龄年龄 char sex;char sex;/性别性别;main()main()Person P1;Person P1;P1.age=20;P1.age=20;/非法非法 coutP1.nameendl;coutP1.nameendl;/非法非法 return 0;return 0;2.public2.public类成员类成员 一个类中的公有一个类中的公有(p
11、ublic)(public)成员(包括数据成员和成员函数)成员(包括数据成员和成员函数)可以被程序中任何代码(包括函数)访问,一般情况下,应尽可以被程序中任何代码(包括函数)访问,一般情况下,应尽量将类的数据成员声明为私有(量将类的数据成员声明为私有(privateprivate),然后为需要被类外),然后为需要被类外部访问的数据成员提供公有的成员函数,实现对私有成员的设部访问的数据成员提供公有的成员函数,实现对私有成员的设置和访问,这种结构能够向类的客户很好的隐藏实现方法,在置和访问,这种结构能够向类的客户很好的隐藏实现方法,在有效减少错误的同时,可以增强程序的可修改性。有效减少错误的同时,
12、可以增强程序的可修改性。3.protected3.protected类成员类成员 使用使用protectedprotected声明的称为保护成员。任何一个类的保护成员声明的称为保护成员。任何一个类的保护成员仅可以被其自己和派生类的所有非静态成员函数和友元函数直仅可以被其自己和派生类的所有非静态成员函数和友元函数直接访问,也就是说其他的外部函数是不能访问它的。因此,对接访问,也就是说其他的外部函数是不能访问它的。因此,对于那些既要对外界隐藏,又要能被派生类访问的成员,可以将于那些既要对外界隐藏,又要能被派生类访问的成员,可以将它们声明为保护成员。它们声明为保护成员。如果基类声明了私有成员,那么任
13、何派生类都是不能访问它如果基类声明了私有成员,那么任何派生类都是不能访问它们的,若希望在派生类中能访问它们,应当把它们声明为保们的,若希望在派生类中能访问它们,应当把它们声明为保护成员。如果在一个类中声明了保护成员,就意味着该类可护成员。如果在一个类中声明了保护成员,就意味着该类可能要用作基类,在它的派生类中会访问这些成员。能要用作基类,在它的派生类中会访问这些成员。8.2.38.2.3三种派生方式的定义三种派生方式的定义 1.1.私有(私有(privateprivate)派生)派生 在声明一个派生类时将派生方式指定为在声明一个派生类时将派生方式指定为privateprivate的,称为私有派
14、生,的,称为私有派生,用私有派生方式建立的派生类称为私有派生类用私有派生方式建立的派生类称为私有派生类 ,其基类称为私有,其基类称为私有基类。基类。由私有派生得到的派生类,它从基类继承的成员都将变为私有由私有派生得到的派生类,它从基类继承的成员都将变为私有成员,也就是说通过私有派生,派生类从基类继承来的公有成成员,也就是说通过私有派生,派生类从基类继承来的公有成员和保护成员都将变成派生类的私有成员,这些成员将只能被员和保护成员都将变成派生类的私有成员,这些成员将只能被派生类的成员函数和友元函数访问。需要重点说明的是,基类派生类的成员函数和友元函数访问。需要重点说明的是,基类的私有成员经过私有派
15、生后继续保持其基类的私有成员身份,的私有成员经过私有派生后继续保持其基类的私有成员身份,无法被派生类访问。无法被派生类访问。2.2.保护(保护(protectedprotected)派生)派生由保护派生得到的派生类,它从基类继承的公有和保护成员都由保护派生得到的派生类,它从基类继承的公有和保护成员都将变为派生类的保护成员。基类的私有成员经过保护派生后继将变为派生类的保护成员。基类的私有成员经过保护派生后继续保持其基类的私有成员身份,依然无法被派生类访问。续保持其基类的私有成员身份,依然无法被派生类访问。保护派生的特点是保护派生的特点是:基类的公用成员和保护成员在派生基类的公用成员和保护成员在派
16、生类中都成了保护成员,其私有成员仍为基类私有。也就是把类中都成了保护成员,其私有成员仍为基类私有。也就是把基类原有的公用成员也保护起来,不让类外任意访问。基类原有的公用成员也保护起来,不让类外任意访问。3.3.公有(公有(publicpublic)派生)派生 由公有派生得到的派生类,它从基类继承的成员都将维持原由公有派生得到的派生类,它从基类继承的成员都将维持原有访问控制特征,即通过公有派生后,派生类从基类继承的有访问控制特征,即通过公有派生后,派生类从基类继承的公有成员在派生类中仍然是公有成员,保护成员仍然是保护公有成员在派生类中仍然是公有成员,保护成员仍然是保护成员,而基类的私有成员经过公
17、有派生后继续保持其基类的成员,而基类的私有成员经过公有派生后继续保持其基类的私有成员身份,依然无法被派生类访问。私有成员身份,依然无法被派生类访问。8.2.48.2.4派生类成员访问控制规则派生类成员访问控制规则 1.1.派生类中新增成员的访问控制遵循类成员访问控制的规则。派生类中新增成员的访问控制遵循类成员访问控制的规则。存取说明符存取说明符访问控制规则访问控制规则PrivatePrivate此派生此派生类类的非静的非静态态成成员员函数和友元函数可以直接函数和友元函数可以直接访问访问ProtectedProtected此派生此派生类类和其子和其子类类非静非静态态成成员员函数和友元函数可以函数
18、和友元函数可以访问访问PublicPublic任何非静任何非静态态成成员员函数,友元函数和非成函数,友元函数和非成员员函数都可以直接函数都可以直接访访问问2.2.类成员在派生类中的访问控制规则类成员在派生类中的访问控制规则 基基类类成成员员的存的存取取说说明符明符派生方式派生方式publicpublic派生派生protectedprotected派生派生privateprivate派生派生PrivatePrivate在派生在派生类类中被中被隐隐藏藏在派生在派生类类中被中被隐隐藏藏在派生在派生类类中被中被隐隐藏藏ProtectedProtected派生派生类类中中为为protectedprote
19、cted派生派生类类中中为为protectedprotected派生派生类类中中为为privateprivatePublicPublic派生派生类类中中为为publicpublic派生派生类类中中为为protectedprotected派生派生类类中中为为privateprivate注意:不管是何种派生,基类的注意:不管是何种派生,基类的privateprivate成员永远都不成员永远都不能被其派生类直接访问,但可以通过基类的能被其派生类直接访问,但可以通过基类的publicpublic和和protectedprotected成员函数访问。成员函数访问。8.3 8.3 派生类的构造函数和析构函
20、数派生类的构造函数和析构函数8.3.18.3.1派生类的构造函数和析构函数的声明派生类的构造函数和析构函数的声明类的构造函数是类的一种特殊的成员函数,它的作用主要类的构造函数是类的一种特殊的成员函数,它的作用主要是为对象分配内存、进行初始化;而析构函数它的作用与是为对象分配内存、进行初始化;而析构函数它的作用与构造函数相反。构造函数相反。派生类的构造函数声明格式如下派生类的构造函数声明格式如下 :派生类的构造函数名称(参数表)派生类的构造函数名称(参数表):基类的构造函数名(参数表)基类的构造函数名(参数表)/派生类构造函数体派生类构造函数体 class Pointclass Point in
21、t x,y;int x,y;public:public:Point(int a,int b)Point(int a,int b)/基类的构造函数基类的构造函数 x=a;x=a;y=b;y=b;cout”Constructing Point class n”;cout”Constructing Point class n”;Point()Point()/基类的析构函数基类的析构函数 cout”Destructing Point class n”;cout”Destructing Point class n”;class Circle:public Pointclass Circle:public
22、 Point double radius;double radius;public:public:Circle(double r,int a,int b):Point(a,b)/Circle(double r,int a,int b):Point(a,b)/派生类的构造函数派生类的构造函数 radius=r;radius=r;cout”Constructing Circle class n”;cout”Constructing Circle class n”;Circle()Circle()/派生类的析构函数派生类的析构函数 cout”Destructing Circle class n”;c
23、out”Destructing Circle class n”;派生类中含有对象成员时,其构造函数的声明格式如下:派生类中含有对象成员时,其构造函数的声明格式如下:派生类的构造函数名称(参数表)派生类的构造函数名称(参数表):基类的构造函数名(参数表)基类的构造函数名(参数表),对象成员名对象成员名1 1(参数表)(参数表),对象成员名对象成员名N N(参数表)(参数表)/派生类构造函数体派生类构造函数体 class Circle2:public Pointdouble radius;Point P1;public:Circle2(double r,int a,int b):Point(a,b
24、),P1(a,b)/派生类的构造函数,定义时派生类的构造函数,定义时/指定了基类的构造函数和对象成员指定了基类的构造函数和对象成员P1的构造函数的构造函数radius=r;cout”Constructing Circle2 class n”;Circle2()/派生类的析构函数派生类的析构函数cout”Destructing Circle2 class n”;8.3.28.3.2派生类的构造函数和析构函数的构造规则派生类的构造函数和析构函数的构造规则 1.1.基类具有显式的构造函数时基类具有显式的构造函数时(1 1)基类具有不带参数的构造函数)基类具有不带参数的构造函数派生类既可以自己不定义构
25、造函数,也可以根据需要定义自己派生类既可以自己不定义构造函数,也可以根据需要定义自己的构造函数,构造函数可以带参数也可以省略,在派生类中定的构造函数,构造函数可以带参数也可以省略,在派生类中定义构造函数时还可省略义构造函数时还可省略“:基类构造函数名(参数表):基类构造函数名(参数表)”。(2 2)基类仅有带参数的构造函数)基类仅有带参数的构造函数 派生类必须显式的定义其构造函数,并在声明时指定其基类的某派生类必须显式的定义其构造函数,并在声明时指定其基类的某一构造函数和参数表,把参数传递给基类构造函数。一构造函数和参数表,把参数传递给基类构造函数。2.2.基类具有隐式的构造函数时基类具有隐式
26、的构造函数时 当基类没有显式的定义(即隐式的定义)构造函数时,派生类当基类没有显式的定义(即隐式的定义)构造函数时,派生类可以根据需要定义自己的构造函数,派生类构造函数的参数表、可以根据需要定义自己的构造函数,派生类构造函数的参数表、基类的构造函数名和参数表都可以根据需要省略。基类的构造函数名和参数表都可以根据需要省略。8.3.38.3.3派生类构造函数和析构函数的调用顺序派生类构造函数和析构函数的调用顺序1.1.构造函数的调用顺序构造函数的调用顺序 派生类对象创建的时候,构造函数的执行顺序为:派生类对象创建的时候,构造函数的执行顺序为:(1 1)基类的构造函数)基类的构造函数(2 2)对象成
27、员的构造函数)对象成员的构造函数(3 3)派生类自身的构造函数)派生类自身的构造函数 2.2.析构函数的调用顺序与构造函数的调用顺序正好相反。即析构函数的调用顺序与构造函数的调用顺序正好相反。即(1 1)派生类自身的析构函数)派生类自身的析构函数(2 2)对象成员的构造函数)对象成员的构造函数(3 3)基类的析构函数)基类的析构函数 【例【例8.68.6】派生类】派生类Circle2Circle2的构造函数和析构函数的执行顺序的构造函数和析构函数的执行顺序/Point/Point和和Circle2Circle2类的定义类的定义main()main()Circle2 C1(0.0,1,1);Ci
28、rcle2 C1(0.0,1,1);cout”-program line-n”;cout”-program line-n”;return 0;return 0;8.4 8.4 多重继承多重继承8.4.18.4.1多重继承的声明多重继承的声明前面讨论的是单继承,即一个类是从一个基类派生而来的。前面讨论的是单继承,即一个类是从一个基类派生而来的。在在C+C+中还允许从多个基类中派生出新的子类,这种派生方法称中还允许从多个基类中派生出新的子类,这种派生方法称为多重继承(或多基派生)。这一强大的派生功能可以大大提为多重继承(或多基派生)。这一强大的派生功能可以大大提高软件重用的灵活性高软件重用的灵活性
29、 。声明的格式如下:声明的格式如下:class class 派生类名派生类名:派生存取说明符(可省)派生存取说明符(可省)1 1 基类名基类名1,1,派生存取说明符派生存取说明符N N 基类名基类名N N/派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数;【例【例8.7】多重继承的声明多重继承的声明#include class Circle1 /基类基类Circle1 protected:int r;public:void setx(int x)r=x;void draw()coutdrawingn;class Circle2 /基类基类Circle2 protected:int
30、r;public:void setx(int x)r=x;void write()coutwritingn;class Circle:public Circle1,public Circle2 /类类Circle公有继承了公有继承了Circle1和和Circle2 public:void show()coutshowingn;void main()Circle cc;cc.draw();cc.write();cc.show();8.4.28.4.2多重继承的几点说明多重继承的几点说明1.1.在多重继承中派生类成员的访问控制规则与单一继承规则相同。在多重继承中派生类成员的访问控制规则与单一继承规
31、则相同。2.2.多重继承的构造函数与析构函数定义与单一继承相似,只是多重继承的构造函数与析构函数定义与单一继承相似,只是在构造函数定义时在构造函数定义时N N个基类的构造函数之间用逗号分隔。个基类的构造函数之间用逗号分隔。3.3.多重继承虽然功能强大,但也容易造成系统的复杂性,设计多重继承虽然功能强大,但也容易造成系统的复杂性,设计时务必正确和谨慎,能用单一继承时尽量不用多重继承。时务必正确和谨慎,能用单一继承时尽量不用多重继承。4.4.多重继承容易产生模糊性,在引用时要注意多重继承容易产生模糊性,在引用时要注意 例如前面例例如前面例8.78.7如果按照下面来引用:如果按照下面来引用:void
32、 main()void main()Circle cc;Circle cc;cc.setx(10);/Circle1cc.setx(10);/Circle1的的setxsetx还是还是Circle2Circle2的的setxsetx?void main()void main()Circle cc;Circle cc;cc.Circle1:setx(10);/cc.Circle1:setx(10);/说明是说明是Circle1Circle1中的中的r r为为1010 8.4.3 8.4.3 虚基类虚基类 1.1.虚基类的概念虚基类的概念在很多情况下,程序员会定义一些类,而不想将其实例化在很多情况
33、下,程序员会定义一些类,而不想将其实例化为任何对象,这样的类称为为任何对象,这样的类称为“虚类虚类”或或“抽象类抽象类”,因为这种虚类,因为这种虚类一般都要被用作基类,所以又被称为一般都要被用作基类,所以又被称为“虚基类虚基类”或或“抽象基类抽象基类”。2.2.虚基类的声明虚基类的声明class 派生类名派生类名:virtual 派生存取说明符(可省)派生存取说明符(可省)虚基类名虚基类名/派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数;3.3.虚基类的初始化虚基类的初始化 虚基类初始化时,构造函数的调用顺序规则:虚基类初始化时,构造函数的调用顺序规则:(1 1)同一层派生中包含
34、多个虚基类时,虚基类的构造函数按它们)同一层派生中包含多个虚基类时,虚基类的构造函数按它们派生时声明的先后次序调用。派生时声明的先后次序调用。(2 2)如某虚基类是由实基类派生而来,则先调用此实基类的构)如某虚基类是由实基类派生而来,则先调用此实基类的构造函数,再调用虚基类的构造函数,最后才是派生类的构造函数。造函数,再调用虚基类的构造函数,最后才是派生类的构造函数。(3 3)若同一层派生中,同时存在虚基类与实基类,应先调用虚基类的)若同一层派生中,同时存在虚基类与实基类,应先调用虚基类的构造函数,再调用实基类的构造函数,最后调用派生类的构造函数。构造函数,再调用实基类的构造函数,最后调用派生
35、类的构造函数。4.4.虚基类的作用虚基类的作用虚基类的作用就是为其他类提供一个合适的基类,以便虚基类的作用就是为其他类提供一个合适的基类,以便派生类可以从它那里继承和实现所需的接口。在多重继承时,派生类可以从它那里继承和实现所需的接口。在多重继承时,当派生类的多个基类有一个共同的基类时,为防止产生二义当派生类的多个基类有一个共同的基类时,为防止产生二义性问题可使用虚基类方法。性问题可使用虚基类方法。注意注意:虚基类并不是在声明基类时声明的,而是在声明虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。因为一个基类可以派生类时,指定继承方式时声明的。因为一个基类可以在生成一
36、个派生类时作为虚基类,而在生成另一个派生在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。类时不作为虚基类。【例【例8.11】存在二义性的虚基类多重派生】存在二义性的虚基类多重派生#include class Base /基类基类protected:int b;public:Base()b=1;cout”Constructing Base class”endl;class Base1:public Base /基类基类1从从Base派派生生public:Base1()cout”Constructing Base1 class”endl;cout”Base b=”bendl;cl
37、ass Base2:public Base /基类基类2从从Base派生派生public:Base2()cout”Constructing Base2 class”endl;cout”Base b=”bendl;class Derived:public Base1,Base2 /从两个基类从两个基类base1和和base2多重派生出子类多重派生出子类public:Derived()cout”Constructing Derived class”endl;cout”Base b=”bendl;main()Derived D1;return 0;改成如下语句:改成如下语句:class Base1:
38、virtual public Baseclass Base2:virtual public Base8.5 8.5 基类和派生类的转换基类和派生类的转换8.5.1 8.5.1 什么是基类和派生类的转换什么是基类和派生类的转换只有公用派生类才是基类真正的子类型,它完整地继承了基类只有公用派生类才是基类真正的子类型,它完整地继承了基类的功能。基类与派生类对象之间有赋值兼容关系,由于派生类的功能。基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替。在
39、用到基类对象的时候可以用其子类对象代替。大多数时候基类和派生类的转换发生在对象之间进行赋值的时候。大多数时候基类和派生类的转换发生在对象之间进行赋值的时候。8.5.2 8.5.2 基类与派生类的转换方法基类与派生类的转换方法1 1可以用派生类对象为基类对象赋值;可以用派生类对象为基类对象赋值;2 2可以用派生类对象初始化基类引用对象;可以用派生类对象初始化基类引用对象;3 3可以把指向派生类对象的指针赋给基类对象的指针;可以把指向派生类对象的指针赋给基类对象的指针;4 4可以把派生类对象的地址赋给基类对象的指针。可以把派生类对象的地址赋给基类对象的指针。8.6 8.6 继承与组合继承与组合在在
40、C+C+中,为了重用已有的软件,除了可以通过继承和派生中,为了重用已有的软件,除了可以通过继承和派生的方式从已有的类产生一个新类外,还可以通过将一个或多的方式从已有的类产生一个新类外,还可以通过将一个或多个类作为类成员的方式来产生一个新的类,这种方式就是组合。个类作为类成员的方式来产生一个新的类,这种方式就是组合。class Date /基类基类Date/;class TelephoneNumber/;class Address/基类基类Address/;class Employee /Employee类中包含类中包含类对象成员,组合了三个类类对象成员,组合了三个类 protected:Date birthday;TelephoneNumber phonenumber;Address homeaddress;/;类的组合和继承一样,是软件重用的重要方式。组合和类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用继承都是有效地利用已有类的资源。但二者的概念和用法不同。法不同。