C课件:第15章C面向对象基础.ppt

上传人:wuy****n92 文档编号:70104224 上传时间:2023-01-16 格式:PPT 页数:48 大小:243.99KB
返回 下载 相关 举报
C课件:第15章C面向对象基础.ppt_第1页
第1页 / 共48页
C课件:第15章C面向对象基础.ppt_第2页
第2页 / 共48页
点击查看更多>>
资源描述

《C课件:第15章C面向对象基础.ppt》由会员分享,可在线阅读,更多相关《C课件:第15章C面向对象基础.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C+第第15 15章章 C+C+面向对象基础面向对象基础15.1面向对象程序设计的基本概念面向对象程序设计的基本概念 面向对象技术(面向对象技术(Object-Oriented echnologyObject-Oriented echnology)是在)是在8080年代末出现的,它是为了适应开发和维护复杂应用软件年代末出现的,它是为了适应开发和维护复杂应用软件的需要,为解决软件危机而诞生的。面向对象的程序设的需要,为解决软件危机而诞生的。面向对象的程序设计方法是继结构化程序设计方法之后的一种新的程序方计方法是继结构化程序设计方法之后的一种新的程序方法。在面向对象的程序设计中,通过对象来表示事物

2、,法。在面向对象的程序设计中,通过对象来表示事物,用对象(用对象(ObjectObject)与对象间消息的传递来表现事物间的)与对象间消息的传递来表现事物间的联系;用对象的方法实现对对象的操作。什么是对象呢联系;用对象的方法实现对对象的操作。什么是对象呢?从概念上讲,对象是代表着正在创建的系统中的一个?从概念上讲,对象是代表着正在创建的系统中的一个实体。从实现形式上讲,对象是一个状态和操作(或方实体。从实现形式上讲,对象是一个状态和操作(或方法)的封装体。状态由对象的数据结构的内容和值定义,法)的封装体。状态由对象的数据结构的内容和值定义,方法是一系列的实现步骤,它由若干操作构成。对对象方法是

3、一系列的实现步骤,它由若干操作构成。对对象进行抽象形成类进行抽象形成类。n n抽象是一种提炼对象特征的方法,它可以将具有公抽象是一种提炼对象特征的方法,它可以将具有公共行为的对象组织成类。类是抽象数据类型的实现,共行为的对象组织成类。类是抽象数据类型的实现,一个类的所有对象都有相同的数据结构,并且共享一个类的所有对象都有相同的数据结构,并且共享相同的实现操作的代码,而各个对象有着各自不同相同的实现操作的代码,而各个对象有着各自不同的状态,即私有的存储。因此,类是所有对象的共的状态,即私有的存储。因此,类是所有对象的共同的行为和不同状态的集合体。面向对象技术的基同的行为和不同状态的集合体。面向对

4、象技术的基本特征主要有:封装性、继承性、多态性。本特征主要有:封装性、继承性、多态性。n n封装性:是将数据结构和对数据进行的操作结合在封装性:是将数据结构和对数据进行的操作结合在一起,形式一个整体,对外隐蔽其内部实现细节,一起,形式一个整体,对外隐蔽其内部实现细节,同时避免了数据紊乱带来的调试与维护的困难。同时避免了数据紊乱带来的调试与维护的困难。n n继承性:是一个对象可以获得另一个对象的继承性:是一个对象可以获得另一个对象的特性的机制。对象的特性包括对象的属性(数特性的机制。对象的特性包括对象的属性(数据)和方法(函数)。继承增强了软件的可扩据)和方法(函数)。继承增强了软件的可扩充性,

5、并为代码重用提供了强有力的手段。充性,并为代码重用提供了强有力的手段。n n多态性:指相同的函数调用被不同的对象接多态性:指相同的函数调用被不同的对象接收时,可以导致不同的行为。它使程序员在设收时,可以导致不同的行为。它使程序员在设计程序时可以对问题进行更好的抽象,以设计计程序时可以对问题进行更好的抽象,以设计出重用性和维护性俱佳的程序。出重用性和维护性俱佳的程序。15.2类和对象类和对象 n n C+C+作为作为C C语言的超集,涵盖了语言的超集,涵盖了C C语言的主要概念和功能,语言的主要概念和功能,但它同时又引入了一些新的概念,其中最主要的是类和对但它同时又引入了一些新的概念,其中最主要

6、的是类和对象的概念。类的设计和使用体现了面向对象的设计思想。象的概念。类的设计和使用体现了面向对象的设计思想。面向对象的程序设计是从分析对象开始的。对象分析方法面向对象的程序设计是从分析对象开始的。对象分析方法的有力工具是分类的有力工具是分类找出一类具有相同属性的对象,并找出一类具有相同属性的对象,并将它们的共同属性用类表示。在实际的程序设计中,是先将它们的共同属性用类表示。在实际的程序设计中,是先定义问题域中的相关对象类定义问题域中的相关对象类(class)(class),然后由类生成对象。,然后由类生成对象。因此,类是由用户定义的特殊数据类型。因此,类是由用户定义的特殊数据类型。n n类的

7、定义与实现类的定义与实现类的定义与实现类的定义与实现n n类中定义的数据和函数分别称为数据成员和成员类中定义的数据和函数分别称为数据成员和成员函数。类的定义格式一般地分为说明部分和实现部函数。类的定义格式一般地分为说明部分和实现部分。说明部分是用来说明该类中的成员,包含数据分。说明部分是用来说明该类中的成员,包含数据成员的说明和成员函数的说明。成员函数是用来对成员的说明和成员函数的说明。成员函数是用来对数据成员进行操作的,又称为数据成员进行操作的,又称为“方法方法”。实现部分。实现部分是成员函数的定义。概括起来,说明部分将告诉使是成员函数的定义。概括起来,说明部分将告诉使用者用者“干什么干什么

8、”,而实现部分是告诉使用者,而实现部分是告诉使用者“怎么怎么干干”。类的定义与类的定义与C C语言中的结构体类似,但结语言中的结构体类似,但结构体中只能定义属性不能定义对这些属性进行操作构体中只能定义属性不能定义对这些属性进行操作的方法(函数)。的方法(函数)。n n 类的定义使用关键字类的定义使用关键字classclass,其后面的标识符定义了一个,其后面的标识符定义了一个新的类型,可以使用这个标识符说明类的变量和指向类的指新的类型,可以使用这个标识符说明类的变量和指向类的指针。针。n n例:定义一个名为例:定义一个名为TPersonTPerson的类,包括这个人的姓名、年龄、的类,包括这个

9、人的姓名、年龄、性别、家庭住址、电话等不同属性,以及对这些属性操作的性别、家庭住址、电话等不同属性,以及对这些属性操作的两个函数。两个函数。n nclass TPerson /class TPerson /通常用通常用T T字母开始的字符串作为类名,以示字母开始的字符串作为类名,以示与与 /对象、函数名区别对象、函数名区别n n private:private:n nchar name20;char name20;n n int age;int age;n n char sex;char sex;n n char address20;char address20;n n long tel;lo

10、ng tel;n n public:public:n n void setdata();void setdata();n nvoid print();void print();n n;/分号不可缺少分号不可缺少n n面向对象的程序设计强调信息隐藏,将实现细面向对象的程序设计强调信息隐藏,将实现细节和不允许外部访问的部分隐藏起来,为此它节和不允许外部访问的部分隐藏起来,为此它把类成员分为公开的(把类成员分为公开的(publicpublic)与私有的)与私有的(privateprivate)两类。外界不能直接访问一个对象的)两类。外界不能直接访问一个对象的私有部分,它们与对象间的信息传送只能通过私

11、有部分,它们与对象间的信息传送只能通过公开成员进行。上面的例子中一共定义了公开成员进行。上面的例子中一共定义了7 7个成个成员:员:5 5个成员数据,个成员数据,2 2个成员函数。成员数据一个成员函数。成员数据一般不能让外界直接访问,只能通过本类的成员般不能让外界直接访问,只能通过本类的成员函数访问。所以把函数访问。所以把5 5个成员数据定义成私有成员个成员数据定义成私有成员(用(用privateprivate定义),把成员函数定义为公开成员定义),把成员函数定义为公开成员(用(用publicpublic定义)。定义)。n n关键字关键字private private、publicpublic

12、被称为访问权限修饰符被称为访问权限修饰符或访问控制修饰符。在一个类的定义中,关键或访问控制修饰符。在一个类的定义中,关键字字private private、publicpublic出现的顺序与次数可以是任出现的顺序与次数可以是任意的。意的。C+C+规定,类成员隐含的访问权限是私规定,类成员隐含的访问权限是私有的,不加声明的成员都默认为私有的。因此,有的,不加声明的成员都默认为私有的。因此,最前面的关键字最前面的关键字privateprivate可以缺省。而结构体类可以缺省。而结构体类型的成员的隐含访问权限是公开的。型的成员的隐含访问权限是公开的。n n类的实现,就是进一步定义它的成员函数。类的

13、实现,就是进一步定义它的成员函数。成员函数是类定义中用以描述对象行为的成员。成员函数是类定义中用以描述对象行为的成员。在成员函数中,可以直接访问类的所有成员。在成员函数中,可以直接访问类的所有成员。成员函数的定义方式与普通函数大体相同,以成员函数的定义方式与普通函数大体相同,以下几点需加以说明:下几点需加以说明:n n成员函数可以在类中定义。例如:成员函数可以在类中定义。例如:n nclass TPerson class TPerson n n private:private:n nchar name20;char name20;n n int age;int age;n n char sex

14、;char sex;n n char address20;char address20;n n long tel;long tel;n n public:public:n n void setdata()void setdata()n n strcpy(name,liling);strcpy(name,liling);n n age=18;age=18;n n sex=f;sex=f;n n strcpy(address,249 shanghailu);strcpy(address,249 shanghailu);n n tel=3041725;tel=3041725;n nvoid prin

15、t()void print()n n coutname,age,sex,address,telendl;coutname,age,sex,address,telendl;n n;n n在类定义外部定义成员函数时,应使用作用域限定符在类定义外部定义成员函数时,应使用作用域限定符“:”指明该函数是哪个类中的成员函数。例如:指明该函数是哪个类中的成员函数。例如:n n class TPerson class TPerson n n private:private:n nchar name20;char name20;n n int age;int age;n n char sex;char sex;

16、n n char address20;char address20;n n long tel;long tel;n n public:public:n n void setdata();/void setdata();/函数原型函数原型n nvoid print()void print();n n;n nvoid TPersonvoid TPerson:setdata()/setdata()/函数实现函数实现n n strcpy(name,liling);strcpy(name,liling);n n age=18;age=18;n n sex=f;sex=f;n n strcpy(addre

17、ss,249 shanghailu);strcpy(address,249 shanghailu);n n tel=3041725;tel=3041725;n n void TPerson void TPerson:print()/print()/函数实现函数实现n n coutname,age,sex,address,telendl;coutname,age,sex,address,telendl;n n类的成员函数也可以重载。类的成员函数也可以重载。n n例例例例15.115.1:n n#include#include n n class point class point n n int

18、 x,y;int x,y;n n public:public:n n void set(int xp,int yp)/void set(int xp,int yp)/成员函数成员函数setsetn n x=xp;y=yp;x=xp;y=yp;n n coutx=xendl;coutx=xendl;n n couty=yendl;couty=yendl;n n ;n n void set(point p)/void set(point p)/成员函数成员函数setset重载重载n n x=p.x;y=p.y;x=p.x;y=p.y;n n cout point:x;cout point:x;n

19、n cout;yendl;cout;yendl;n n;n nvoid main()void main()n n point pp,qq;/point pp,qq;/定义定义pointpoint类的对象类的对象pppp和和qqqqn npp.set(10,20);pp.set(10,20);n nqq.set(pp);qq.set(pp);n n运行结果:运行结果:n nx=10 x=10n ny=20y=20n npoint:10,20point:10,20n n注意:在类定义中,不允许对所定义的数据成员进行初注意:在类定义中,不允许对所定义的数据成员进行初始化。始化。n n例例例例15.2

20、15.2分析下面程序的输出结果。分析下面程序的输出结果。n n#include#include n n class R class Rn n public:public:n n R(intR(int r1,int r2)R1=r1;R2=r2;r1,int r2)R1=r1;R2=r2;n n void print()const;void print()const;n nprivate:private:n n intint R1,R2;R1,R2;n n;n nvoid R:print()constvoid R:print()constn n coutcoutR1;R2R1;R2endlend

21、l;n nvoid main()void main()n n const R b(20,52);const R b(20,52);n n b.print();b.print();n n程序运行结果如下:程序运行结果如下:n n20;5220;52n n说明:说明:n n在类在类R R中,说明了一个常成员函数中,说明了一个常成员函数print()print()。n n常成员函数说明格式如下:常成员函数说明格式如下:n n ()const;)const;n n其中,其中,constconst是加在函数说明后面的类型修饰是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,符,它是函数类

22、型的一个组成部分,因此,在函数实现部分也要带在函数实现部分也要带constconst关键字。关键字。n n 在在main()main()函数中,定义了一个常对象函数中,定义了一个常对象b b,只,只有常成员函数才能操作常对象,没有使用有常成员函数才能操作常对象,没有使用constconst关键字说明的成员函数不能用来操作常关键字说明的成员函数不能用来操作常对象。对象。n n对象的定义n n定义了一个类之后,便可以像用定义了一个类之后,便可以像用intint、charchar等类型符等类型符声明简单变量一样,用它们定义对象,也称为类的声明简单变量一样,用它们定义对象,也称为类的实例化。有时也可以

23、将对象称为类变量,因为它同实例化。有时也可以将对象称为类变量,因为它同变量一样是程序实体,并具有像变量一样的属性,变量一样是程序实体,并具有像变量一样的属性,如生存期等存储属性。如生存期等存储属性。n n类的实例化通过声明语句进行。如已经定义了类类的实例化通过声明语句进行。如已经定义了类TPersonTPerson,便可以用声明语句生成对象:便可以用声明语句生成对象:n n TPersonTPerson zhangzhang,li li;n n应当注意,一个类只是定义了一种类型,只有它被实例化,应当注意,一个类只是定义了一种类型,只有它被实例化,生成对象后,才能接收和存储具体的值。生成对象后,

24、才能接收和存储具体的值。ZhangZhang、li li便是两便是两个不同的对象,它们占有不同的内存区域,保存有不同的数个不同的对象,它们占有不同的内存区域,保存有不同的数据,但它们形式相同,操作代码也相同。对象的定义格式为:据,但它们形式相同,操作代码也相同。对象的定义格式为:n n 类名类名 对象名表;对象名表;n n每个对象都是由数据成员和成员函数组成的。既可以访问对每个对象都是由数据成员和成员函数组成的。既可以访问对象的数据成员,也可以访问对象的成员函数。访问成员函数象的数据成员,也可以访问对象的成员函数。访问成员函数时,将执行实现该成员函数的代码。时,将执行实现该成员函数的代码。C+

25、C+在实现时,成员函在实现时,成员函数为该类的所有对象共享。数为该类的所有对象共享。n n访问对象的成员使用访问对象的成员使用“.”运算符,其格式为:运算符,其格式为:n n 对象名对象名.对象成员名对象成员名n n例例例例15.315.3:使用:使用TPersonTPerson类的一个简单程序。类的一个简单程序。n n#include#include n n#include#include n nclass class TPersonTPerson n n ;n nvoid main()void main()n n TPersonTPerson my;/my;/声明声明TPersonTPer

26、son类的对象类的对象mymyn n my.setdatamy.setdata();/();/调用调用TPersonTPerson类的成员函数类的成员函数setdatasetdata()()n n my.print();/my.print();/调用调用TPersonTPerson类的成员函数类的成员函数printprint()()n n n n运行结果如下:运行结果如下:n nliling18f249 shanghailu3041725liling18f249 shanghailu3041725n n用指向对象的指针访问对象的成员,其格式为:用指向对象的指针访问对象的成员,其格式为:n n

27、指向对象的指针名指向对象的指针名-对象成员名对象成员名n n例如:例如:TPerson zhang;/TPerson zhang;/生成生成TPersonTPerson类的对类的对象象zhangzhangn n TPerson*pc;/TPerson*pc;/声明指向声明指向TPersonTPerson类的对类的对象的指针象的指针n n pc=&zhang;/pc=&zhang;/将对象将对象zhangzhang的地址赋给指的地址赋给指针针pcpcn n当指针得到了对象的地址后,就可以用其访问当指针得到了对象的地址后,就可以用其访问对象的成员。如:对象的成员。如:n n pc-print();

28、pc-print();n n它等价于:它等价于:n n (*pc*pc).print().print();n n n n前面讲述了通过定义成员函数的方法给对前面讲述了通过定义成员函数的方法给对象的数据成员赋值。下面讲述如何对对象进象的数据成员赋值。下面讲述如何对对象进行初始化。行初始化。n n在在C+C+中,声明一个类的变量时,可以自动中,声明一个类的变量时,可以自动的调用一个用户定义的初始化函数。这个函的调用一个用户定义的初始化函数。这个函数是类的特殊的成员函数,称为构造函数。数是类的特殊的成员函数,称为构造函数。构造函数可以由用户定义,也可以由系统给构造函数可以由用户定义,也可以由系统给出

29、。系统给出的的构造函数称为缺省构造函出。系统给出的的构造函数称为缺省构造函数。缺省构造函数不能对对象中的成员数据数。缺省构造函数不能对对象中的成员数据进行有效的初始化。当声明一个对象时,程进行有效的初始化。当声明一个对象时,程序将自动调用类的构造函数。类的构造函数序将自动调用类的构造函数。类的构造函数和类有相同的名字。构造函数不返回任何值,和类有相同的名字。构造函数不返回任何值,也不能返回也不能返回voidvoid。n n例:对类例:对类TPersonTPerson可以定义如下构造函数取可以定义如下构造函数取代上面定义的代上面定义的setdatasetdata()()函数。函数。n n TPe

30、rson:TPerson(voidTPerson:TPerson(void)n n strcpy(namestrcpy(name,lilingliling););n n age=18;age=18;n n sex=f;sex=f;n n strcpy(address,249 strcpy(address,249 shanghailushanghailu););n n teltel=3041725;=3041725;n n析构函数也是一种特殊的类成员函数,它析构函数也是一种特殊的类成员函数,它的功能正好与构造函数相反。析构函数用的功能正好与构造函数相反。析构函数用于释放对象被分配的内存空间,在对

31、象删于释放对象被分配的内存空间,在对象删除前,用它来做一些清理工作。析构函数除前,用它来做一些清理工作。析构函数的名字是类名前加一个的名字是类名前加一个“”符号。析构函符号。析构函数不返回任何值,也不能返回数不返回任何值,也不能返回voidvoid。如果一如果一个类中没有定义析构函数时,编译系统也个类中没有定义析构函数时,编译系统也生成一个缺省析构函数,缺省析构函数是生成一个缺省析构函数,缺省析构函数是一个空函数。一个空函数。n n例例例例15.4315.43:n n#include#include n nclass pointclass pointn n int x,y;int x,y;n

32、npublic:public:n n void show();void show();n n point()/point()/定义构造函数定义构造函数n n x=0;y=0;coutConstructorn;x=0;y=0;coutConstructorn;n n point()/point()/定义析构函数定义析构函数n n coutDestructorn;coutDestructorn;n n;n n#include#include n nvoid point:show()void point:show()n ncoutxcoutx:yendl;yendl;n nvoid main()vo

33、id main()n n point p;/point p;/声明变量时自动调用构造函数。声明变量时自动调用构造函数。n n p.show();p.show();n n /变量作用域的结尾自动调用析构函数变量作用域的结尾自动调用析构函数n n程序运行结果:程序运行结果:n nConstructorConstructorn n0 0:0 0n nDestructorDestructorn n说明:说明:n n1 1、构造函数和析构函数不能使用、构造函数和析构函数不能使用returnreturn语句返回值。语句返回值。n n3 3、构造函数可以重载,可以有形参;析构函数不能重载。一个、构造函数可以

34、重载,可以有形参;析构函数不能重载。一个类中只可能定义一个析构函数。类中只可能定义一个析构函数。n n何时调用构造函数和析构函数:何时调用构造函数和析构函数:n n1 1、自动变量的作用域是某个模块,当此模块被激活时,自动变、自动变量的作用域是某个模块,当此模块被激活时,自动变量调用构造函数,当退出此模块时,会调用析构函数。量调用构造函数,当退出此模块时,会调用析构函数。n n2 2、全局变量在进入、全局变量在进入main()main()函数之前会调用构造函数,在程序终止函数之前会调用构造函数,在程序终止时会调用析构函数。时会调用析构函数。n n3 3、动态分配的对象当使用、动态分配的对象当使

35、用new new 时为对象分配内存时会调用构造时为对象分配内存时会调用构造函数;使用函数;使用deletedelete删除对象时会调用析构函数。删除对象时会调用析构函数。n n4 4、临时变量是为支持计算,由编译器自动产生的。临时变量的、临时变量是为支持计算,由编译器自动产生的。临时变量的生存期的开始和结尾会调用构造函数和析构函数。生存期的开始和结尾会调用构造函数和析构函数。15.3派生类与继承派生类与继承n n继承性是面向对象程序设计中最重要的机制,也继承性是面向对象程序设计中最重要的机制,也是传统的结构化程序语言所不具有的。它提供了是传统的结构化程序语言所不具有的。它提供了组织程序和复用代

36、码的强有力的手段。组织程序和复用代码的强有力的手段。n n通过继承机制,可以利用已有的数据类型来定义通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。例如,新定义的成员,而且还同时拥有旧的成员。例如,要定义一个类要定义一个类TEmployee(TEmployee(职工职工),它与类,它与类TPersonTPerson(人人)之间有这样的关系:之间有这样的关系:n n类类TEmployeeTEmployee(职工职工)是类是类TPersonTPerson(人人)的的子集。子集。n n

37、类类TEmployeeTEmployee(职工职工)的属性要比类的属性要比类TPersonTPerson(人人)多。一个多。一个TPersonTPerson类对象增加成类对象增加成员员departmentdepartment(部门)和部门)和salary(salary(工资工资)才能得才能得到到TEmployeeTEmployee类。类。n n继承可以清晰自然的表达实际问题中分类继承可以清晰自然的表达实际问题中分类结构或层次结构,它通过对一个已存在的类结构或层次结构,它通过对一个已存在的类进行特殊化来建立新的类。已存在的类称为进行特殊化来建立新的类。已存在的类称为基类(也称为父类或超类);新建

38、立的类称基类(也称为父类或超类);新建立的类称为派生类(也称为子类)。派生类不但继承为派生类(也称为子类)。派生类不但继承了基类所有的数据成员和成员函数,而且可了基类所有的数据成员和成员函数,而且可以添加新的数据成员和成员函数,改变所继以添加新的数据成员和成员函数,改变所继承的成员函数的语义。承的成员函数的语义。n n派生类的定义格式如下:派生类的定义格式如下:n n class class :n n ;n n如:定义如:定义TEmployee(TEmployee(职工职工)类。类。n nclass TEmployee:public TPersonclass TEmployee:public

39、TPersonn n char department20;char department20;n n float salary;float salary;n n;n nTEmployee(TEmployee(职工职工)类除了继承类除了继承TPersonTPerson类的所有成员类的所有成员外,又增加了外,又增加了2 2个新的成员。个新的成员。n n例例例例15.515.5:n n#include#include n n#include#include n nclass TPerson class TPerson n n n nprotected:protected:n nchar name20

40、;char name20;n nint age;int age;n nchar sex;char sex;n nchar address20;char address20;n nlong tel;long tel;n npublic:public:n nTPerson(void)TPerson(void)n n strcpy(name,liling);strcpy(name,liling);n n age=18;age=18;n n sex=f;sex=f;n n strcpy(address,249 shanghailu);strcpy(address,249 shanghailu);n n

41、 tel=3041725;tel=3041725;n nvoid print()void print()n n coutname,age,sex,address,telendl;coutname,age,sex,address,telendl;n n;n nclass TEmployee:protected TPerson class TEmployee:protected TPerson n n/定义新的类定义新的类TEmployee,TEmployee,它是它是TPersonTPerson类的派生类类的派生类n n n nprotected:protected:n nchar depart

42、ment20;char department20;n nfloat salary;float salary;n npublic:public:n nTEmployee():TPerson()TEmployee():TPerson()n n strcpy(department,Computer);strcpy(department,Computer);n n salary=2010.34f;salary=2010.34f;n nvoid print()void print()n ncoutname,age,sex,address,tel,;coutname,age,sex,address,tel

43、,;n n coutdepartment,salaryendl;coutdepartment,salaryendl;n n;n nvoid main()void main()n n TEmployee te1;TEmployee te1;/定义定义TEmployeeTEmployee类的对象类的对象te1te1n n te1.print();/te1.print();/调用调用TEmployeeTEmployee的成员函数的成员函数print()print()n n程序运行结果:程序运行结果:n n liling,18,f,249 shanghailu,3041725,Computer,201

44、0.34 liling,18,f,249 shanghailu,3041725,Computer,2010.34n n 常使用如下三种关键字给予表示:常使用如下三种关键字给予表示:n npublicpublic:表示公有继承。其特点是在公有继承的情况表示公有继承。其特点是在公有继承的情况下,在派生类中可以访问基类中的公有成员和保护成下,在派生类中可以访问基类中的公有成员和保护成员。但不能访问基类的私有成员。员。但不能访问基类的私有成员。n nprotected:protected:表示保护继承。其特点是基类的所有公有表示保护继承。其特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且

45、只能成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。仍然是私有的。n nprivateprivate:表示私有继承。其特点是基类的公有成表示私有继承。其特点是基类的公有成员和私有成员在私有派生类中作为私有成员,并且员和私有成员在私有派生类中作为私有成员,并且不能被这个派生类的子类所访问,而基类中的私在不能被这个派生类的子类所访问,而基类中的私在成员在私有派生类中是不能直接访问的。成员在私有派生类中是不能直接访问的。n n将上述三种不同的继承方式的基类特性与派生类将上述三种不同的继承方式的基类

46、特性与派生类特性列出表格,见表特性列出表格,见表15.115.1n n在一般情况下,都使用公有继承,很少使用私有在一般情况下,都使用公有继承,很少使用私有继承。因为私有继承当再派生出下一级时,基类的继承。因为私有继承当再派生出下一级时,基类的所有成员都将被私有化,其他类成员也不可再直接所有成员都将被私有化,其他类成员也不可再直接访问。如果基类成员只由有血缘关系的成员访问,访问。如果基类成员只由有血缘关系的成员访问,而不被无血缘关系的对象成员访问时,则要使用保而不被无血缘关系的对象成员访问时,则要使用保护继承。护继承。private,protected,public作为类成员的可见性修饰符,将产

47、生如下影响:在一个类中定义的成员函数,可以访问本类中的任何成员,但只能直接访问基类中的protected成员和public成员。一个类对象,只能直接访问本类或其基类中的public成员。通过C+语言中的继承机制,可以扩充和完善旧的程序设计以适应新的需求,这样不仅可以节省程序开发的时间和资源,并且为未来程序设计增添了新的资源。像例像例15.3.115.3.1,从一个基类,从一个基类(TPerson)(TPerson)派生的继承称派生的继承称为单继承。在为单继承。在+语言中,一个派生类可以从语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从多一个基类派生,也可以从多个基类派生。从多个基

48、类派生的继承称为多继承。多继承的定义个基类派生的继承称为多继承。多继承的定义格式如下:格式如下:n nclass class :,2,n n n n ;n n可以看出,多继承的派生类有多个基类。可以看出,多继承的派生类有多个基类。n n例例例例15.615.6定义一个圆柱体类,该定义一个圆柱体类,该类可实现求圆柱体体积,它继类可实现求圆柱体体积,它继承了圆类和高类。圆类可以求承了圆类和高类。圆类可以求圆面积,能描述圆心和半径。圆面积,能描述圆心和半径。类层次结构如图类层次结构如图15.115.1所示。所示。n nclass Circleclass Circlen nfloat x,y,r;fl

49、oat x,y,r;n n public:public:n n Circle(float a,float b,float c)x=a;y=b;r=c;Circle(float a,float b,float c)x=a;y=b;r=c;n n float float getx()returngetx()return x;x;n n float float gety()returngety()return y;y;n n float float getr()returngetr()return r;r;n n float area()float a;a=r*r*3.14159f;return a

50、;float area()float a;a=r*r*3.14159f;return a;n n;n nclass Highclass Highn nfloat high;float high;n n public:public:n n High(float h)high=h;High(float h)high=h;n n float float geth()returngeth()return high;high;n n;n nclass Cylinder:public Circle,private Highclass Cylinder:public Circle,private Highn

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁