c++面向对象程序设计第3章-类和对象.ppt

上传人(卖家):三亚风情 文档编号:3376721 上传时间:2022-08-25 格式:PPT 页数:84 大小:356KB
下载 相关 举报
c++面向对象程序设计第3章-类和对象.ppt_第1页
第1页 / 共84页
c++面向对象程序设计第3章-类和对象.ppt_第2页
第2页 / 共84页
c++面向对象程序设计第3章-类和对象.ppt_第3页
第3页 / 共84页
c++面向对象程序设计第3章-类和对象.ppt_第4页
第4页 / 共84页
c++面向对象程序设计第3章-类和对象.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

1、第第3章章 类和对象类和对象 本章介绍类与对象的定义、成员函数、构造函数、析构函数、对象与本章介绍类与对象的定义、成员函数、构造函数、析构函数、对象与指针等基本概念及应用,讲解指针等基本概念及应用,讲解C+C+的继承、重载、多太性等特性,使读者的继承、重载、多太性等特性,使读者掌握掌握C+C+的编程基本知识。的编程基本知识。n3.1 类与对象的定义类与对象的定义n3.2 成员函数成员函数n3.3 构造函数构造函数n3.4 析构函数析构函数n3.5 对象与指针对象与指针n3.6 类与结构类与结构n3.7 继承继承n3.8 多重继承多重继承n3.9 派生类的对象和构造函数派生类的对象和构造函数n3

2、.10 多态性多态性n3.11 重载重载n3.12 虚拟函数虚拟函数n实验实验3 类和对象、继承和派生类和对象、继承和派生 n1类的定义类的定义类定义的语法如下:类定义的语法如下:classclass类名类名 private:private:数据成员或成员函数;数据成员或成员函数;public:public:数据成员或成员函数;数据成员或成员函数;protected:protected:数据成员或成员函数;数据成员或成员函数;3.1 类与对象的定义类与对象的定义 类的定义由两大部分组成,即类的类的定义由两大部分组成,即类的数据成员数据成员和和成员函数成员函数。类的数据成员和成员函数也称为类的属

3、性和类的操作。数据成类的数据成员和成员函数也称为类的属性和类的操作。数据成员类似员类似C C结构中的变量,成员函数定义了类对数据的操作,反映结构中的变量,成员函数定义了类对数据的操作,反映了类行为和类的能力。了类行为和类的能力。例例3.13.1:定义一个student类,用以描述学生对象。123 class Student private:char m_Name20;int m_Age;int m_Sex;char m_cl20;int m_number;public:void Register(char*Name,int Age,char Sex,char*cl,int number);vo

4、id GetName(char*Name);int GetAge();char GetSex();void Getcl(char*cl);int Getnumber();程序实现:程序实现:n2对象的定义对象的定义 对象是类的实例。从技术上讲,一个对象就是一个具有某种类对象是类的实例。从技术上讲,一个对象就是一个具有某种类类型的变量。与普通变量一样,对象也必须先经声明才可以使用。类型的变量。与普通变量一样,对象也必须先经声明才可以使用。声明一个对象的一般形式为:声明一个对象的一般形式为:1,,2,例例:Student Student1,Student2;声明了两个名为声明了两个名为Studen

5、t1和和Student2的的Student类的对象。类的对象。在程序中使用一个对象,通常是通过对体现对象特征的数据成员的在程序中使用一个对象,通常是通过对体现对象特征的数据成员的操作实现的。当然,由于封装性的要求,这些操作又是通过对象的成员操作实现的。当然,由于封装性的要求,这些操作又是通过对象的成员函数实现的。具体来说:函数实现的。具体来说:(1)成员函数访问同类中的数据成员,或调用同类中的其他成员函数,)成员函数访问同类中的数据成员,或调用同类中的其他成员函数,可直接使用数据成员名或成员函数名;可直接使用数据成员名或成员函数名;(2)在对象外访问其数据成员或成员函数需使用运算符)在对象外访

6、问其数据成员或成员函数需使用运算符“.”访问对象的访问对象的成员成员,例如:例如:number=Student1.Getnumber();(3)不能直接访问一个对象中的私有成员,如果直接访问则导致语法)不能直接访问一个对象中的私有成员,如果直接访问则导致语法错误;错误;(4)同类对象之间可以整体赋值。例如:)同类对象之间可以整体赋值。例如:Student2=Student1;(5)对象用作函数的参数时属于赋值调用;函数可以返回一个对象。)对象用作函数的参数时属于赋值调用;函数可以返回一个对象。3.2 成员函数成员函数 在类的定义中仅给出了成员函数的原型,函数的定义还需在其他地方在类的定义中仅给

7、出了成员函数的原型,函数的定义还需在其他地方(通常每个类的成员函数的定义放在一起构成一个源程序文件)给出。(通常每个类的成员函数的定义放在一起构成一个源程序文件)给出。类的成员函数的一般形式为:类的成员函数的一般形式为:函数名:函数名()函数体函数体 其中作用域运算符其中作用域运算符“:”指出成员函数的类属。没有类属的函数称为指出成员函数的类属。没有类属的函数称为公共函数。公共函数。例例3.2.1 3.2.1 类成员函数的定义。类成员函数的定义。说明:按例说明:按例3-13-1说明的方法添加头文件说明的方法添加头文件Student.hStudent.h,输入,输入StudentStudent类

8、的定义。然后类的定义。然后为项目添加一源代码文件为项目添加一源代码文件Student.cppStudent.cpp /Example(Student.cpp):Student类成员函数的定义类成员函数的定义#include#include“Student.h”void Student:Register(char*Name,int Age,char Sex,char*class,int number);strcpy(m_Name,name);m_Age=age;m_Sex=(sex=m?0:1);strcpy(m_ cl,cl);m_ number=number;void Student:Get

9、Name(char*name)strcpy(name,m_Name);int Student:GetAge()return m_Age;char Student:GetSex()return(m_Sex=0?m:f):void Student:Getcl(char*cl)strcpy(cl,m_ cl);int Student:Getnumber()return m_number例例3.2.2 3.2.2 定义定义StudentStudent类,并将类类,并将类StudentStudent的成员函数声明为内的成员函数声明为内联函数联函数。cl Student private:char m_Na

10、me20;int m_Age;int m_Sex;char m_cl20;int m_number;public:void Register(char*Name,int Age,char Sex,char*cl,int number)strcpy(m_Name,name);m_Age=age;m_Sex=(sex=m?0:1);strcpy(m_ cl,cl);m_ number=number;void GetName(char*Name)strcpy(name,m_Name);int GetAge()return m_Age;char GetSex()return(m_Sex=0?m:f);

11、void Getcl(char*cl)strcpy(cl,m_ cl);int Getnumber()return m_number;例例3.2.33.2.3学生资料的输入输出。学生资料的输入输出。/Example:学生资料的输入和输出学生资料的输入和输出#include#void main()void OutStudentData(Student);char name20,sex;int age;char cl20;int number;Student Student1,Studen2;coutnameage sexclnumber;Student1.Register(name,age,se

12、x,cl,number);Student2.Register(“Zhang2”,19,m,“9901”,100);cout“student 1:t”;OutStudentData(Student1);cout“Student2:t”;OutStudentData(Student2);Student2=Student1;Cout“Student3:t”;OutStudentData(Student2);void OutStudentData(Student);char name20;char cl20;Student.GetName(name);Student.GetCl(cl)coutname

13、“t”Student.GetAge()“t”Student.GetSex()“t”cl“t”Student.Getnumber()end1;Enter a Students name、age、sex、cl and number:zhang1 20 f“9901”101输入:输入:Student1:zhang1 20 f 9901 101输出输出Enter a Students name、age、sex、cl and number:zhang2 19 m“9902”100输入:输入:Student2:zhang2 19 m 9902 100输出输出Enter a Students name、ag

14、e、sex、cl and number:zhang3 20 f“9901”102输入:输入:Student3:zhang3 20 f 9901 102输出输出3.3 构造函数构造函数 构造函数是与类名相同的特殊成员函数,当定义对象或者用构造函数是与类名相同的特殊成员函数,当定义对象或者用new 动态生动态生成对象时,编译程序将自动调用构造函数以实现对象的初始化。构造函数与成对象时,编译程序将自动调用构造函数以实现对象的初始化。构造函数与普通成员函数的区别,是不允许指定返回类型,也不返回值。构造函数允许普通成员函数的区别,是不允许指定返回类型,也不返回值。构造函数允许重载。重载。构造函数的声明格

15、式为:构造函数的声明格式为:(););例例3.3.1 3.3.1 为类为类StudentStudent增加构造函数。增加构造函数。/Example:为类为类Student增加构造函数增加构造函数#includeclass StudentPrivate:char m_Name20;int m_Age;int m_Sex;char m_cl20;int m_number;Public:Student(const char*name,int age,char sex,const char cl,int number)/构造函数构造函数strcpy(m_Name,name);m_Age=age;m_S

16、ex=(sex=m?0:1);strcpy(m_cl,cl);m_number=number;void Register(char*Name,int Age,char Sex,char*cl,int number);void GetName(char*Name);int GetAge();char GetSex();void Getcl(char*cl);int Getnumber();说明:如果在类中没有声明任何构造函数的话,系统会自动地为它定义一个说明:如果在类中没有声明任何构造函数的话,系统会自动地为它定义一个形如形如 :()()的缺省构造函数,这种不带任何参数且函数体为空的的缺省构造函

17、数,这种不带任何参数且函数体为空的构造函数就叫做缺省的构造函数。如果在类声明中已经定义了构造函数,则构造函数就叫做缺省的构造函数。如果在类声明中已经定义了构造函数,则系统不再提供缺省的构造函数。系统不再提供缺省的构造函数。3.4 析构函数析构函数 析构函数的函数名是在类名前加波浪名析构函数的函数名是在类名前加波浪名“”的特殊成员函数。析构的特殊成员函数。析构函数与构造函数的功能正好相反;构造函数在对象生成时为其他分配存储空函数与构造函数的功能正好相反;构造函数在对象生成时为其他分配存储空间,而析构函数的功能是在对象销毁时释放它所占用的内存。析构函数与构间,而析构函数的功能是在对象销毁时释放它所

18、占用的内存。析构函数与构造函数一样没有返回值,但它不带参数,不能被重载。造函数一样没有返回值,但它不带参数,不能被重载。析构函数的声明方法为:析构函数的声明方法为:class Exampleclass Example public:public:Example();/Example();/析构函数;析构函数;当类的声明中没有定义析构函数时,编译程序会自动产生一个当类的声明中没有定义析构函数时,编译程序会自动产生一个默认的析构函数。默认的析构函数。例例:include class Example public:Example();Example();Example()cout“Object is

19、 created!”n;Example:Example()cout“Object is destroyed!”,例如,例如:Ptr-GetAge();当对象接收到一个消息时,便会调用相应的成员函数。这时当对象接收到一个消息时,便会调用相应的成员函数。这时,系统会向系统会向该成员函数传递一个隐含的参数该成员函数传递一个隐含的参数,即指向该对象自身的指针,即即指向该对象自身的指针,即this指针。一指针。一般来说,般来说,this指针用途不大,因为在成员函数中可以直接使用本对象内部的指针用途不大,因为在成员函数中可以直接使用本对象内部的所有成员变量和成员函数。但在某些场合中调用其他类的成员函数时,

20、可能所有成员变量和成员函数。但在某些场合中调用其他类的成员函数时,可能需用要传送本对象的地址,在需用要传送本对象的地址,在Windows程序设计中这种情况很多,这时就程序设计中这种情况很多,这时就要用到要用到this指针。指针。3.6 类与结构类与结构 C+中有一个结构体类型,其定义和使用方法与类非常相似。中有一个结构体类型,其定义和使用方法与类非常相似。结构体类型的定义方法如下:结构体类型的定义方法如下:Struct ;例:可定义一个表示日期的结构体类型。例:可定义一个表示日期的结构体类型。struct dateint da_year;int da_mon;int da_day;即一个日期类

21、型的变量有即一个日期类型的变量有3 3个成员变量个成员变量:年份年份(da_year(da_year)、月份(、月份(da_monda_mon)和日)和日(da_day(da_day)。在定义好结构体类型以后,就可以定义该类型的变量了在定义好结构体类型以后,就可以定义该类型的变量了:struct;注意在定义时可以略去结构体类型说明符注意在定义时可以略去结构体类型说明符structstruct,这一点与这一点与C C语言不同。语言不同。例:变量声明语句。例:变量声明语句。date yesterday,today,tomorrow;声明了声明了3个日期类型的变量个日期类型的变量:yesterday

22、、today和和tomorrow。结构体类型的变量可用作函数的参数或者函数的返回值。结构体类型的变量可用作函数的参数或者函数的返回值。对结构体类型变量的成员变量的引用方法与类相同:对结构体类型变量的成员变量的引用方法与类相同:.例:例:today.da_year=2001;today.da_mon=10;today.da_day=10;3.7 继承继承 继承性是面向对象程序设计语言的主要特征之一。继承性是面向对象程序设计语言的主要特征之一。继承性指的是一个新类可以从现有的类中派生出来,继承性指的是一个新类可以从现有的类中派生出来,继承该类的特性。被继承的类称为基类(继承该类的特性。被继承的类称

23、为基类(base class)或父)或父类(类(parent class),继承的类称为派生类(),继承的类称为派生类(derived class)或子类(或子类(child class)。)。继承性允许建立类层次结构,是程序中代码可复用性继承性允许建立类层次结构,是程序中代码可复用性的关键,并提供对多态性的支持,是的关键,并提供对多态性的支持,是C+面向对象程序设计面向对象程序设计的基石。的基石。3.7 继承继承n 1继承与类层次结构继承与类层次结构生物生物动物动物植物植物微生物微生物爬行动物爬行动物哺乳动物哺乳动物鸟类鸟类猫科动物猫科动物猫猫图图 人类认识事物的抽象层次人类认识事物的抽象层

24、次 在软件设计中,人们模拟这一过程。在面向对象的程序设计在软件设计中,人们模拟这一过程。在面向对象的程序设计中,继承提供了重用已有代码生成新类的方法。继承在类之间中,继承提供了重用已有代码生成新类的方法。继承在类之间建立了关系。子类可以继承父类的所有数据结构和操作,只要建立了关系。子类可以继承父类的所有数据结构和操作,只要在子类中添加父类没有的数据结构和操作。在子类中添加父类没有的数据结构和操作。在上图中,对象类型在上图中,对象类型CButtonCButton是从是从CWndCWnd派生出来的,派生出来的,CWndCWnd是从是从CCmdTargetCCmdTarget派派生出来的,而生出来的

25、,而CCmdTargetCCmdTarget又是从又是从CObjectCObject派生出来的。派生出来的。CObjectCCmdTargetCByteArrayCCmdTargetCframeWndCDialogCButton2派生类的工作方式派生类的工作方式 在在C+程序中,当程序中,当一个类是从一个基类派一个类是从一个基类派生出来的时候,该派生生出来的时候,该派生类就继承了基类所有的类就继承了基类所有的成员变量和成员函数,成员变量和成员函数,而且可以加入自己的成而且可以加入自己的成员变量和成员函数。但员变量和成员函数。但是,基类中声明为私有是,基类中声明为私有的成员变量和成员函数的成员变

26、量和成员函数是不可为派生类访问的。是不可为派生类访问的。基基 类类变量变量1 1变量变量2 2函数函数1 1函数函数2 2派生类派生类其他变量其他变量其他函数其他函数图图 说明基类和派生类之间的层次关系说明基类和派生类之间的层次关系 3派生一个类派生一个类 声明一个派生类的语法形式为:声明一个派生类的语法形式为:class 派生类名称:继承权限派生类名称:继承权限 基类名称基类名称 ;其中,继承权限说明符有三种:其中,继承权限说明符有三种:public、private和和protected,默认权限为,默认权限为private。在类的定义中,所有。在类的定义中,所有公有成员都允许其他函数访问,

27、而私有成员则只能供公有成员都允许其他函数访问,而私有成员则只能供成员函数访问。但是,当派生类继承基类的特性时,成员函数访问。但是,当派生类继承基类的特性时,派生类无法访问基类中的私有成员。若想让基类中的派生类无法访问基类中的私有成员。若想让基类中的某些成员不仅可供成员函数访问,而且可将其特性传某些成员不仅可供成员函数访问,而且可将其特性传给派生类,那么应将其声明为保护类型。给派生类,那么应将其声明为保护类型。例:类继承的例子例:类继承的例子。#include class parent /声明基类声明基类int i;/私有成员变量私有成员变量i仅供成员函数使用,不能传递给派仅供成员函数使用,不能

28、传递给派生类生类protected:/受保护成员变量仅供成员函数使用,可供派生类使用受保护成员变量仅供成员函数使用,可供派生类使用int x;public:/公有成员,可供任何函数使用公有成员,可供任何函数使用parent();void change();void show();parent:parent()/定义构造函数定义构造函数x=0;i=0;void parent:change()/定义成员函数定义成员函数x+;i+;void parent:show()/定义成员函数定义成员函数cout”x=”x”n”;class son:public parent/声明声明son为为parent的派

29、生类,继承权限为的派生类,继承权限为public,即,即parent类的类的/公有成员在公有成员在son中仍为公有成员,中仍为公有成员,parent类的保护成员在类的保护成员在son中仍为中仍为/保护成员保护成员public:void increase();/声明成员函数声明成员函数;void son:increase()/定义成员函数体定义成员函数体x+;保护成员变量保护成员变量x公有成员函数公有成员函数parent公有成员函数公有成员函数change公有成员函数公有成员函数increase公有成员函数公有成员函数show 经过类继承,派生类经过类继承,派生类son访问以下成员访问以下成员

30、例例 某公司使用某公司使用EMPINFOEMPINFO程序管理自己的雇员信息。后来,当该程序管理自己的雇员信息。后来,当该公司在国外开了分支机构而且雇佣不止一个国家的雇员时,如何重公司在国外开了分支机构而且雇佣不止一个国家的雇员时,如何重新设计新设计EMPINFOEMPINFO程序呢?程序呢?提示:为了满足跨国公司的需要,程序设计者从提示:为了满足跨国公司的需要,程序设计者从EMPINFOEMPINFO程序中使用的程序中使用的EmpInfoEmpInfo类派生了一个新类,名为类派生了一个新类,名为OffshoreEmpInfoOffshoreEmpInfo。#include class Emp

31、Info /基类基类public:EmpInfo()/构造函数和析构函数构造函数和析构函数EmpInfo()private:char*m_name;char*m_dept;char*m_position;long m_salary;public:void SetName(char*name)m_name=name;/设置员变量的值设置员变量的值void SetDept(char*dept)m_dept=dept;void SetPosition(char*position)m_position=position;SetSalary(long salary)m_salary=salary;voi

32、d PrintInfo();class OffshoreEmpInfo:public EmpInfo /派生类派生类public:OffshoreEmpInfo()/构造函数和析构函数构造函数和析构函数OffshoreEmpInfo()private:char*m_country;public:void SetCountry(char*country)m_country=country;void PintInfo();void EmpInfo:PrintInfo()cout ”Name:”m_name ”n”;cout ”Department:”m_dept ”n”;cout ”Positio

33、n:”m_position ”n”;cout ”Salary:”m_salary ”n”;void OffshoreEmpInfo:PrintInfo()EmpInfo:PrintInfo();Cout “Country:”m_Country “n”;int main()OffshoreEmpInfo empInfo;/定义类定义类OffshoreEmpInfo的对象的对象empInfo.SetName(“Paul Norton”);empInfo.SetDept(“Development”);empInfo.SetPosition(“Engineer”);empInfo.SetSalary(

34、24000);empInfo.SetCountry(“New Zealand”);empInfo.PrintInfo();return 0;Name:Paul NortonDepartment:DevelopmentPosition:EngineerSalary:24000Country:New Zealand输出输出 3.8 多重继承多重继承 基类与派生类之间可以有复杂的多对多关系。在基类与派生类之间可以有复杂的多对多关系。在类继承中,允许某个类同时继承多个基类,即所谓类类继承中,允许某个类同时继承多个基类,即所谓类的多重继承。在类的多重继承中,基类和派生类间是的多重继承。在类的多重继承中,

35、基类和派生类间是多对一的关系。多对一的关系。基类基类1 1基类基类2 2基类基类n n派生类派生类继承继承 继承继承 继承继承 继承继承 通过多重继承,派生类将继承多个基类的特性,此通过多重继承,派生类将继承多个基类的特性,此时基类和派生类的声明方式为:时基类和派生类的声明方式为:class N1 /声明基类声明基类N1 ;class Nm/声明基类声明基类Nm ;class S:public N1,public Nm /声明派生类声明派生类S同时继承基类同时继承基类N1,,基类,基类Nm ;注意:继承一个以上的基类,要使用逗号分隔的表,还要确保为每个被继注意:继承一个以上的基类,要使用逗号分

36、隔的表,还要确保为每个被继承的基类使用一个继承权限说明符。承的基类使用一个继承权限说明符。例:两用沙发是一个沙发,也是一张床,两用沙发同时具有沙发和床的特性。程例:两用沙发是一个沙发,也是一张床,两用沙发同时具有沙发和床的特性。程序中类序中类SleeperSofaSleeperSofa继承继承BedBed和和SofaSofa两个类。两个类。#include class Sofaprotected:int length;public:Sofa():length(0)void SitOn()coutSitting.n;void SetLength(int i)length=i;class Bedp

37、rotected:int length;public:Bed():length(0)void Sleep()coutSleeping.n;void SetLength(int i)length=i;class SleepSofa:public Sofa,public Bed/继承多个基类继承多个基类public:SleepSofa()void FoldOut()/折叠与打开折叠与打开cout”Folt/Out the sofa.n”;void main()SleepSofa sf;sf.SitOn();sf.FoldOut();sf.Sleep();Sitting.Folt/Out the s

38、ofa.Sleeping.运行结果运行结果 3.9 派生类的对象和构造函数派生类的对象和构造函数n1派生类的对象派生类的对象 用某个基类声明一个派生类后,仍然可以利用基类来声明用某个基类声明一个派生类后,仍然可以利用基类来声明对象,而且所声明的对象和派生类所声明的对象不会冲突。对象,而且所声明的对象和派生类所声明的对象不会冲突。void main()son ob1;/用派生类用派生类son定义一个对象定义一个对象ob1 parent ob2;/用基类用基类parent定义一个对象定义一个对象ob2 cout”Display derived class object ob1”;ob1.show(

39、);/对象对象ob1的显示结果的显示结果 ob1.change();/调用从基类中继承的成员函数调用从基类中继承的成员函数 ob1.increase();/调用派生类中声明的成员函数调用派生类中声明的成员函数 cout”Display base class object ob2”;ob2.change();ob2.show();Display derived class object ob1 x=0Display base class object ob2 x=1运行结果运行结果n1派生类的对象派生类的对象 用某个基类声明一个派生类后,仍然可以利用基类来声明用某个基类声明一个派生类后,仍然可以

40、利用基类来声明对象,而且所声明的对象和派生类所声明的对象不会冲突。对象,而且所声明的对象和派生类所声明的对象不会冲突。void main()son ob1;/用派生类用派生类son定义一个对象定义一个对象ob1 parent ob2;/用基类用基类parent定义一个对象定义一个对象ob2 cout”Display derived class object ob1”;ob1.show();/对象对象ob1的显示结果的显示结果 ob1.change();/调用从基类中继承的成员函数调用从基类中继承的成员函数 ob1.increase();/调用派生类中声明的成员函数调用派生类中声明的成员函数 c

41、out”Display base class object ob2”;ob2.change();ob2.show();Display derived class object ob1 x=0Display base class object ob2 x=1运行结果运行结果n2派生类对象的构造函数和析构函数派生类对象的构造函数和析构函数#include class basepublic:base()cout”Constructing basen”;base()cout”Destructing basen”;class derived:public basepublic:derived()cout

42、”cout”Constructing derivedn”;base()cout”Destructing derivedn”;main()derived ob;/do nothing but construct and destruct obreturn 0;Constructing baseconstructing derivedDestructing derivedDestructing base运行结果运行结果 由此可得出一般性的结论:当创建派生类的对象时,如由此可得出一般性的结论:当创建派生类的对象时,如果基类包含构造函数,它将首先执行,派生类的构造函数紧随果基类包含构造函数,它将首先执

43、行,派生类的构造函数紧随其后。当撤消派生类的对象时,它的析构函数将首先执行,如其后。当撤消派生类的对象时,它的析构函数将首先执行,如果基类包含析构函数,其析构函数将紧随其后。换句话说,构果基类包含析构函数,其析构函数将紧随其后。换句话说,构造函数按其引入的顺序执行,析构函数按其引入的相反顺序执造函数按其引入的顺序执行,析构函数按其引入的相反顺序执行。行。在多层继承的情况下(即一个派生类成为另一个派生类在多层继承的情况下(即一个派生类成为另一个派生类的基类),一般规则是,构造函数按引入的顺序执行,析构函的基类),一般规则是,构造函数按引入的顺序执行,析构函数按反序执行。数按反序执行。n3向基类构

44、造函数传递参数向基类构造函数传递参数 如何向基类的构造函数传递参数呢?答案是使用向一个如何向基类的构造函数传递参数呢?答案是使用向一个或多个基类的构造函数传递参数的派生类构造函数声明的扩或多个基类的构造函数传递参数的派生类构造函数声明的扩展格式即可。展格式即可。这种扩展的派生类构造函数声明的一般格式为:这种扩展的派生类构造函数声明的一般格式为:derived_constructor(arg_list):base1(arg_list),base2(arg_list),baseN(arg_list);/body of derived constructor 其中,其中,base1到到baseN是派

45、生类继承的基类名。注意,是派生类继承的基类名。注意,在有多个基类的情况下,用冒号将派生类的构造函数说明和在有多个基类的情况下,用冒号将派生类的构造函数说明和基类分开,用逗号将基类分开。基类分开,用逗号将基类分开。例例 3.9.2 3.9.2 下面的例子使用了多个基类。下面的例子使用了多个基类。#include class base1protected:int i;public:base1(int x)i=x;cout”Constructing base1n”;/基类基类1的有参构造函数的有参构造函数 base1()cout”Destructing base1n”;class base2prot

46、ected:int k;public:base2(int x)k=x;cout”Constructing base2n”;/基类基类2的有参构造函数的有参构造函数 base2()cout”Destructing base2n”;class derived:public base1,public base2 int j;public:derived(int x,int y,int z):base1(y),base2(z)/derived使用使用x,y,z传递参数给基类构造函传递参数给基类构造函数数j=x;cout”Constructing derivedn”;derived()cout”Dest

47、ructing derivedn”;void show()couti”j”k”n”;main()derived ob(3,4,5);/定义类定义类derived的对象的对象ob ob.show();/显示显示 4 3 5return 0;Constructing base1Constructing base2Constructing derived4 3 5Destructing derivedDestructing base2Destructing base1运行结果运行结果n1多态性(多态性(polymorphism)多态性指的是一个接口名称具有多种功能,是面向对象程序设计多态性指的是一个

48、接口名称具有多种功能,是面向对象程序设计的重要特性之一。的重要特性之一。C+有两种多态性有两种多态性,一是静态的多态性一是静态的多态性,一是运行时一是运行时的多态性。所谓静态的多态性,是指操作作用的确切对象是在运行的多态性。所谓静态的多态性,是指操作作用的确切对象是在运行之前(即编译时)就能确定的,所以相应的反应也是在运行之前就之前(即编译时)就能确定的,所以相应的反应也是在运行之前就能确定的,这种多态性在能确定的,这种多态性在C+中是用重载实现的。所谓运行时的多中是用重载实现的。所谓运行时的多态性,是指操作作用的确切对象依赖于运行的进程,其相应的反应态性,是指操作作用的确切对象依赖于运行的进

49、程,其相应的反应必须在运行时动态给出。必须在运行时动态给出。C+是通过虚拟函数(是通过虚拟函数(virtual function)实现这种多态性的。实现这种多态性的。n2静态联编与动态联编静态联编与动态联编 联编是指将函数调用与相应的函数体代码彼此关联的过程,若联编是指将函数调用与相应的函数体代码彼此关联的过程,若此过程在程序开始运行前的编译阶段完成,称为静态联编。此过程在程序开始运行前的编译阶段完成,称为静态联编。与静态联编不同,在程序运行时进行的联编方式,称为动态联与静态联编不同,在程序运行时进行的联编方式,称为动态联编。一般说来,动态联编是通过指针来实现的。编。一般说来,动态联编是通过指

50、针来实现的。3.10 多态性多态性 3.11 重载重载n1函数重载函数重载(1)函数重载及其好处)函数重载及其好处 函数重载允许一个程序内声明多个名称相同的函数,这些函数可函数重载允许一个程序内声明多个名称相同的函数,这些函数可以完成不同的功能,并可以带有不同类型、不同数目的参数及返回值。以完成不同的功能,并可以带有不同类型、不同数目的参数及返回值。使用函数重载可以减轻用户的记忆负担,并使程序结构简单、易懂。使用函数重载可以减轻用户的记忆负担,并使程序结构简单、易懂。重载包含函数重载和操作符重载,是重载包含函数重载和操作符重载,是C+语言提供的一个语言提供的一个重要特性。重载不仅为编译时的多态

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(c++面向对象程序设计第3章-类和对象.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|