第三部分面向对象特性_第1页
第三部分面向对象特性_第2页
第三部分面向对象特性_第3页
第三部分面向对象特性_第4页
第三部分面向对象特性_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Visual C+与面向对象程序设计教程第三部分第三部分 面向对象面向对象1、类和对象:数据和对应操作封装在一起、类和对象:数据和对应操作封装在一起2、继承和派生:、继承和派生:3、多态性、多态性面向对象的思想面向对象的思想 n面向过程的程序设计面向过程的程序设计(Structure Programming)l以功能为中心,采用函数来描述(动词)n面向对象程序设计面向对象程序设计(OOP)l面向对象程序设计方法认为,客观世界是由各种各样的实体组成的,这些实体就是面向对象方法中的对象。 l消息是向某对象请求服务的一种表达方式 l对象之间的交互通过发送消息来实现。 l消息包括:目标对象 ,请求的方

2、法 ,参数 面向对象程序设计的特点面向对象程序设计的特点n四个基本特征:四个基本特征:l抽象(类)(数据抽象+代码抽象 )l封装(过程和数据封藏起来)l继承(基类和派生类)l多态性(虚函数、函数重载)OOP的优点的优点n开发时间短,效率高,可靠性高,所开发的程序开发时间短,效率高,可靠性高,所开发的程序更强壮更强壮n重用,共享,可维护性,精简重用,共享,可维护性,精简n适合于大程序长时间的开发工作适合于大程序长时间的开发工作类与对象类与对象n类的声明类的声明n类的定义类的定义l成员函数的定义l数据成员的定义n对象的引用对象的引用n对象作函数的参数对象作函数的参数n对象作函数的返回值对象作函数的

3、返回值为什么要引入类为什么要引入类n工资单:姓名、单位、编号工资单:姓名、单位、编号.n成绩单:姓名、学号、各科成绩成绩单:姓名、学号、各科成绩. n简单数据单元无法将这样记录作为一个数据单位简单数据单元无法将这样记录作为一个数据单位处理处理n一一对应关系一一对应关系以工资单为例以工资单为例月份月份工号工号姓名姓名工作部门工作部门工作时间工作时间基本工资基本工资2002.90002张三张三西安交大西安交大1990.7.11000校内津贴校内津贴岗位津贴岗位津贴水电费水电费房租房租实发工资实发工资200300501501300类的层次关系类的层次关系n工作部门:字符串工作部门:字符串n姓名:字符

4、串姓名:字符串n职务:代码(职务:代码(099)intn工作时间:工作时间:l年(xxxx): intl月(112): charl日(131): char n家庭情况家庭情况l婚否:(0,1) int l是否是双职工:int 类类(Class)-数据类型数据类型n类是具有相同属性和相同的方法的对象的集合,它是一种既类是具有相同属性和相同的方法的对象的集合,它是一种既包含数据又包含函数的抽象数据类型。包含数据又包含函数的抽象数据类型。n类是将一类对象和其他对象区别开来的一组描述。类是将一类对象和其他对象区别开来的一组描述。n类是对象集合的抽象,对象是类的一个实例。类是对象集合的抽象,对象是类的一

5、个实例。n类的种类类的种类用用struct关键字声明的类关键字声明的类用用union关键字声明的类关键字声明的类用用class关键字声明的类关键字声明的类类的定义类的定义 1 1数据成员(数据成员(Data MemberData Member),即类的属性;),即类的属性;2 2成员函数(成员函数(Member FunctionMember Function),即类的方法;),即类的方法;3 3构造函数(构造函数(constructorconstructor)和析构函数()和析构函数(destructordestructor),这将在),这将在7.47.4节介绍;节介绍;4 4运算符函数,在第

6、运算符函数,在第9 9章介绍。章介绍。对象对象(Object)-数据数据n对象是包含现实世界物体特征的抽象对象是包含现实世界物体特征的抽象实体实体,反映,反映了系统为之保存信息和(或)与之交互的能力。了系统为之保存信息和(或)与之交互的能力。对象对象=数据数据+作用于这些数据上的操作作用于这些数据上的操作=属性属性(Attribute)+方法方法(Method)消息消息(Message) -函数调用函数调用n消息是向某对象请求服务的一种表达方式。消息是向某对象请求服务的一种表达方式。n对象之间通过传递消息来实现相互的通信。对象之间通过传递消息来实现相互的通信。类的定义类的定义 class pr

7、ivate:/私有成员私有成员 ;public:/公有成员公有成员 ;protected:/保护成员保护成员 ; ;分析分析:编写简单的人事系统(子程序)编写简单的人事系统(子程序)人人工作部门工作部门姓名姓名出生日期出生日期职务职务工资工资基本工资基本工资岗位津贴岗位津贴定义一个定义一个Person类,用来说明人员类对象类,用来说明人员类对象/ Example 7-1:定义:定义Person类类class Person private:charm_strName20;int m_nAge;intm_nSex;public:voidRegister(char *name, int age, c

8、har sex);char *GetName();int GetAge();charGetSex();voidShowMe();成员函数的定义成员函数的定义成员函数的一般形式:成员函数的一般形式: : ()编写编写Person类成员函数的定义。类成员函数的定义。/ Example 7-2:Person类成员函数的定义类成员函数的定义void Person: Register(char *name, int age, char sex)strcpy(m_strName, name);m_nAge = age;m_nSex = (sex = m?0:1);char *Person: GetName

9、()return m_strName; int Person: GetAge() return m_nAge; char Person: GetSex()return (m_nSex = 0?m:f); void Person: ShowMe()cout GetName() t GetAge() t GetSex() endl; 对象的引用对象的引用n说明对象的一般形式说明对象的一般形式(类的实例化类的实例化): , , n对类成员的访问对类成员的访问 . 运算符- 运算符Person对象的引用对象的引用1.1.成员函数访问同类中的数据成员成员函数访问同类中的数据成员 (公有和私有)(公有和私

10、有)2.2.在对象外访问其数据成员或成员函数需使用运算符在对象外访问其数据成员或成员函数需使用运算符“”访问对象的成员访问对象的成员 3.3.禁止直接访问一个对象中的私有成员禁止直接访问一个对象中的私有成员4.4.同类对象之间可以整体赋值同类对象之间可以整体赋值5.5.对象用作函数的参数时属于赋值调用;函数可以返回一个对象用作函数的参数时属于赋值调用;函数可以返回一个对象。对象。 例如:例如:Person person1,person2; int nage=person1.GetAge();person1=person2;Person *p;p=new Person;nage=p-GetAge

11、();完整的人事资料输入输出程序。完整的人事资料输入输出程序。 / Example 7-3:人事资料的输入和输出:人事资料的输入和输出void main()char name20, sex; int age; Person person1, person2;cout name age sex;person1.Register(name, age, sex);cout person1: t; person1.ShowMe();person1.Register(Zhang3, 19, m);cout person1: t; person1.ShowMe();person2 = person1; /

12、对象之间的赋值对象之间的赋值cout person2: t; person2.ShowMe();多文件结构多文件结构 按照按照WINDOWS程序多文件的特点,将其改造成多文程序多文件的特点,将其改造成多文件结构件结构通常将类的定义放在头文件中,成员函数的实现放通常将类的定义放在头文件中,成员函数的实现放在类对应的在类对应的CPP文件中;然后通过文件中;然后通过#include的包含关的包含关系将多文件联系起来。系将多文件联系起来。内联成员函数内联成员函数 class Personprivate:char m_strName20; int m_nAge; int m_nSex;public:vo

13、idRegister(char *name, int age, char sex)strcpy(m_strName,name);m_nAge = age;m_nSex = (sex = = m?0:1); char * GetName()return m_strName; int GetAge()return m_nAge; char GetSex()return (m_nSex = = 0?m:f); ;构造函数与析构函数构造函数与析构函数n构造函数(构造函数(ConstructorConstructor)定义了创建对象的方法,提供了)定义了创建对象的方法,提供了初始化对象的一种简便手段。初

14、始化对象的一种简便手段。 n与构造函数相对应,析构函数(与构造函数相对应,析构函数(DestructorDestructor)用于撤消一个)用于撤消一个对象。对象。 构造函数(构造函数(Constructor)n格式:格式: ();n注意事项:注意事项:l构造函数必须与类名相同l构造函数没有返回值l其功能是对对象进行初始化,一般由一系列赋值语句构成l由系统自动调用析构函数(析构函数(Destructor)n格式为:格式为::();n注意事项:注意事项:l函数名与类名相同,只是在前边加“”符号l析构函数不得返回任何值l析构函数不得带有任何参数l其功能是释放对象成员所占用的存储,一般由一系列的de

15、lete组成l由系统自动调用为类为类Person增加构造函数和析构函数。增加构造函数和析构函数。 class Personclass PersonPrivate:Private:char m_char m_strNamestrName20;20;intintm_m_nAgenAge; ; intintm_m_nSexnSex; ;public:public:person(const char person(const char * *name, name, intint age, char sex)/ age, char sex)/构造函数构造函数 strcpystrcpy(m_(m_strN

16、amestrName, name);m_, name);m_nAgenAge = age; = age; m_ m_nSexnSex = (sex =m?0:1); = (sex =m?0:1); void Register(char void Register(char * *Name, Name, intint Age, char Sex); Age, char Sex); void void GetNameGetName(char (char * *Name);Name); int GetAgeint GetAge();(); char char GetSexGetSex();();数据

17、成员的初始化数据成员的初始化n1 1在构造函数的函数体中进行初始化。在构造函数的函数体中进行初始化。n2 2在构造函数的头部初始化。在构造函数的头部初始化。n3 3混合初始化。混合初始化。n4 4拷贝构造函数拷贝构造函数在构造函数的函数体中初始化在构造函数的函数体中初始化class Personchar m_strName20; int m_nAge; int m_nSex;public:Person() strcpy(m_strName,”XXX”); m_nAge=0; m_nSex=0; Person(char *name, int age, char sex)strcpy(m_strN

18、ame, name); m_nAge = age; m_nSex = (sex = m?0:1); 例如例如, 当遇到声明当遇到声明Person personl(“Zhang3”, 19, f);Person person2 = Person(“Zhang3”, 19, f);在构造函数的头部初始化。在构造函数的头部初始化。其格式为:其格式为::():(), , ()例如例如Person:Person(): m_nAge(0), m_nSex(0)混合初始化混合初始化 。例如例如Person:Person(): m_nAge(0), m_nSex(0)strcpy(m_strName, “XX

19、X”);拷贝构造函数拷贝构造函数 拷贝构造函数是一种特殊的构造函数拷贝构造函数是一种特殊的构造函数 例如Person( Person &p)strcpy(m_strName, p.GetName();m_nAge = p.GetAge();m_nSex = (p.GetSex()= m?0:1);Person personl(“Zhang3”, 19, f);Person person2 = Person(“Zhang3”, 19, f);对象与指针对象与指针n指向对象的指针指向对象的指针类名类名 *指针变量名表;指针变量名表;例例:Person person1(“Zhang3”,19

20、,f);Person *ptr=&Person1;ptr-Speak();n动态存储动态存储l名字指针new 名字(名字初始化值);ldelete 名字指针;例: Person *p=new Person; delete p;nthis指针指针:指向该对象本身的指针指向该对象本身的指针MFC的的CString类类 (#include )1.赋值赋值/连接运算连接运算=、 +、 +=2.比较运算比较运算、=、=、Compare、CompareNoCase3.截取运算截取运算Mid、Left、Right4.转换运算转换运算MakeUpper、MakeLower、MakeReverseCSt

21、ring类类(续续)5.查看字符信息查看字符信息GetAt、GetLength、IsEmpty6.修改字符信息修改字符信息SetAt、Insert、Delete7.格式化输出格式化输出FormatCString类举例类举例#include #include void main()CString s;s=123456789;coutsendl;s.MakeReverse();coutsendl;s.Format(s=%d,100);coutsendl;MFC的的CTime类和类和CTimeSpan类类 n构造函数构造函数CTime、GetCurrentTimen截取函数截取函数GetYear、G

22、etMonth、GetDayn转换函数转换函数Formatn运算符运算符=、+、-CTime类举例类举例#include #include void main()CTime t;CString s;t=CTime( 1999, 3, 19, 22, 15, 0 ); s = t.Format( %A, %B %d, %Y );coutsendl;t = CTime:GetCurrentTime();s = t.Format( %A, %B %d, %Y );couts, =, , =, =, =,!=!= / / 比较两个比较两个CTimeCTime对象对象举例举例 : :CTimeCTime

23、 t1( 2000, 3, 19, 22, 15, 0 ); t1( 2000, 3, 19, 22, 15, 0 );CTimeCTime t2( 2000, 3, 20, 22, 15, 0 ); t2( 2000, 3, 20, 22, 15, 0 );CTimeSpanCTimeSpan tsts = t2 - t1; = t2 - t1;/ / 计算两日期的间隔计算两日期的间隔t2 += t2 += CTimeSpanCTimeSpan( 1, 0, 0, 0 );/ ( 1, 0, 0, 0 );/ 在某日期上加一间隔在某日期上加一间隔类的嵌套类的嵌套 class Employee

24、class Employee CStringCStringm_m_sDepartmentsDepartment; ;/ / 工作部门工作部门 CStringCStringm_m_sNamesName; ;/ / 姓名姓名 CTimeCTimem_m_tBirthdatetBirthdate; ;/ / 出生日期出生日期 PositionPositionm_m_nPositionnPosition; ;/ / 职务职务 CTimeCTimem_m_tDateOfWorktDateOfWork; ;/ / 参加工作时间参加工作时间 SalarySalarym_Salary;m_Salary;/ /

25、 工资工资public:public:Employee(LPCTSTR Employee(LPCTSTR lpszDepartlpszDepart, LPCTSTR , LPCTSTR lpszNamelpszName, , CTimeCTime tBirthdatetBirthdate,Position ,Position nPositionnPosition, , CTimeCTime tDateOfWorktDateOfWork);/ );/ 构构造函数造函数 . .继承和派生继承和派生n派生类的定义格式为:派生类的定义格式为:class 派生类名:继承方式派生类名:继承方式 基类名基类

26、名1,继承方式,继承方式 基类基类名名2,继承方式,继承方式 基类名基类名n派生类增加的成员声明;派生类增加的成员声明;; 水果的分类水果的分类派生类的语法结构派生类的语法结构class : private: 新增私有数据成员和成员函数新增私有数据成员和成员函数protected: 新增保护数据成员和成员函效新增保护数据成员和成员函效public: 新增公有数据成员和成员函效新增公有数据成员和成员函效派生类中的变化派生类中的变化 n派生类对基类的扩充派生类对基类的扩充 n派生类对基类成员的改造派生类对基类成员的改造 n系统的默认值就是私有继承(系统的默认值就是私有继承(privatepriva

27、te)。)。 派生类的继承方式派生类的继承方式n私有继承私有继承privaten公有继承公有继承publicn保护继承保护继承protected公有继承公有继承(public)公有继承方式创建的派生类对基类各种成员访问公有继承方式创建的派生类对基类各种成员访问权限如下权限如下 :l基类公有成员相当于派生类的公有成员,即派生类可以基类公有成员相当于派生类的公有成员,即派生类可以象访问自身公有成员一样访问从基类继承的公有成员。象访问自身公有成员一样访问从基类继承的公有成员。 l基类保护成员相当于派生类的保护成员,即派生类可以基类保护成员相当于派生类的保护成员,即派生类可以象访问自身的保护成员一样,

28、访问基类的保护成员。象访问自身的保护成员一样,访问基类的保护成员。 l对于基类的私有成员,派生类内部成员无法直接访问。对于基类的私有成员,派生类内部成员无法直接访问。派生类使用者也无法通过派生类对象直接访问。派生类使用者也无法通过派生类对象直接访问。 实例实例:公有继承公有继承(public) class Person private:char m_strName20;int m_nAge;intm_nSex;public:voidGetName(char *Name);intGetAge();char GetSex();. . ;class Employee:public Personcha

29、r m_sDepartment21;char m_sPosition21;float m_fSalary;public:Employee()void SetDepartment(const char *);void SetSalary(float);char *GetPosition() const;float GetSalary() const;. .;从从PersonPerson类公有派生一个职员类类公有派生一个职员类 class Employee: public Person char m_strDept20;float m_fSalary; public: Employee() Emp

30、loyeeRegister(XXX,0,m,XXX,0); EmployeeRegister(char *name, int age, char sex, char *dept, float salary);void ShowMe(); ;私有继承私有继承 (private)派生类对基类各种成员访问权限如下派生类对基类各种成员访问权限如下 :l基类公有成员和保护成员都相当于派生类的私基类公有成员和保护成员都相当于派生类的私有成员,派生类只能通过自身的函数成员访问有成员,派生类只能通过自身的函数成员访问他们他们 l对于基类的私有成员,无论派生类内部成员或对于基类的私有成员,无论派生类内部成员或派

31、生类使用者都无法直接访问。派生类使用者都无法直接访问。 实例实例:私有继承私有继承(private) class Person private:charm_strName20;int m_nAge;intm_nSex;public:voidGetName(char *Name);intGetAge();char GetSex();. . ;class Employee:private Personchar m_sDepartment21;char m_sPosition21;float m_fSalary;public:Employee()void SetDepartment(const ch

32、ar *);void SetSalary(float);char *GetPosition() const;float GetSalary() const;. .;人员类(人员类(Person)的私有派生类)的私有派生类class Employee: private Person /雇员类定义雇员类定义char m_strDept20;/工作部门工作部门float m_fSalary; /月薪月薪public: Employee() EmployeeRegister(XXX,0,m,XXX,0); EmployeeRegister(char *name, int age, char sex,

33、char *dept, float salary);void ShowMe(); /显示雇员信息显示雇员信息 char* GetEmployeeName() returnGetName(); /取姓名取姓名char GetEmployeeSex() returnGetSex(); /取性别取性别int GetEmployeeAge() returnGetAge(); /取年龄取年龄;保护继承保护继承(public)保护继承方式创建的派生类对基类各种成员访问保护继承方式创建的派生类对基类各种成员访问权限如下权限如下 :l基类的公有成员和保护成员都相当于派生类的基类的公有成员和保护成员都相当于派生

34、类的保护成员,派生类可以通过自身的成员函数或保护成员,派生类可以通过自身的成员函数或其子类的成员函数访问他们其子类的成员函数访问他们l对于基类的私有成员,无论派生类内部成员或对于基类的私有成员,无论派生类内部成员或派生类使用者都无法直接访问派生类使用者都无法直接访问 派生类的构造函数和析构函数派生类的构造函数和析构函数n派生类构造函数的一般形式为:派生类构造函数的一般形式为:派生类名:派生类名(参数总表):基类名派生类名:派生类名(参数总表):基类名1(参数表(参数表1),基类名,基类名n(参数表(参数表n),),内嵌对象名内嵌对象名1(对象参数表(对象参数表1),),内嵌对象名,内嵌对象名m

35、(对象参(对象参数表数表m)派生类新增加成员的初始化;派生类新增加成员的初始化;n派生类与基类的析构函数没有什么联系,彼此独立,派生类派生类与基类的析构函数没有什么联系,彼此独立,派生类或基类的析构函数只作各自类对象消亡前的善后工作或基类的析构函数只作各自类对象消亡前的善后工作 派生类构造函数和析构函数的执行派生类构造函数和析构函数的执行 class Person char m_strName10; intm_nAge;public:Person(char* name,int age) strcpy(m_strName, name);m_nAge = age;coutconstructor o

36、f personm_strNameendl; Person() coutdeconstrutor of personm_strNameendl;派生类构造函数和析构函数的执行派生类构造函数和析构函数的执行class Employee : public Personchar m_strDept20;Person Wang;public:Employee(char *name, int age, char *dept, char *name1, int age1): Person(name,age) , Wang(name1,age1)strcpy(m_strDept, dept);coutcon

37、structor of Employeeendl;Employee() coutdeconstrucor of Employeeendl; ;派生类构造函数的执行次序派生类构造函数的执行次序n首先,调用基类构造函数,调用顺序按照它们被首先,调用基类构造函数,调用顺序按照它们被继承时声明的基类名顺序执行。继承时声明的基类名顺序执行。n其次,调用内嵌对象构造函数,调用次序按各个其次,调用内嵌对象构造函数,调用次序按各个对象在派生类内声明的顺序。对象在派生类内声明的顺序。n最后,执行派生类构造函数体中的内容。最后,执行派生类构造函数体中的内容。 析构函数析构函数 n派生类析构函数执行过程恰与构造函数

38、执行过程派生类析构函数执行过程恰与构造函数执行过程相反。相反。n首先执行派生类析构函数首先执行派生类析构函数n然后执行内嵌对象的析构函数然后执行内嵌对象的析构函数n最后执行基类析构函数最后执行基类析构函数 类模版类模版template class class ;多态性含义多态性含义 n实现实现“一种接口,多种方法一种接口,多种方法”的技术的技术n某类的对象在接受同样的消息时,做出不同的响某类的对象在接受同样的消息时,做出不同的响应应多态性的形式多态性的形式 n编译时多态性编译时多态性 l编译器对源程序进行编译时就可以确定所调用的是哪一个函数,编译时多态性通过重载来实现;函数重载运算符重载 n运

39、行时多态性运行时多态性 l在程序运行过程中根据具体情况来确定调用的是哪一个函数;虚函数编译时多态性编译时多态性函数重载(兔子逃生函数重载(兔子逃生 )class 兔子兔子public: void 逃生(老鹰逃生(老鹰a)“兔子蹬鹰兔子蹬鹰”;void 逃生(狼逃生(狼 b)“动如脱兔动如脱兔”; 运行时多态性运行时多态性虚函数(虚函数( cat or dog? )class 宠物宠物public: void char* speak() cout zzz; ; ;class 猫猫 : public 宠物宠物public: void char* speak() cout miao!miao!; ;

40、class 狗狗 : public宠物宠物public: void char* speak() coutspeak(); 派生类对象替换基类对象派生类对象替换基类对象 n原则:原则:凡是基类对象出现的场合都可以用公有派生类对象取代 n形式形式 (1)派生类对象给基类对象赋值(2)派生类对象可以初始化基类对象的引用(3)可以令基类对象的指针指向派生类对象,即将派生类对象的地址传递给基类指针 例:派生类对象替换基类对象例:派生类对象替换基类对象 #include class Pet /基类基类public:void Speak() coutHow does a pet speak ?endl; ;

41、class Cat : public Pet /派生类派生类public:void Speak() coutmiao!miao!endl; ; 例:例: 派生类对象替换基类对象(续一)派生类对象替换基类对象(续一)class Dog : public Pet/派生类派生类public:void Speak() coutwang!wang!Speak(); p1 = &dog1; /用用Dog类对象地址给基类指针赋值类对象地址给基类指针赋值p1-Speak(); p2=new Cat;/动态生成动态生成Cat类对象类对象p2-Speak();p3=new Dog;/动态生成动态生成Dog

42、类对象类对象p3-Speak();Pet&p4 = cat1;/以以Cat类对象初始化类对象初始化Pet类引用类引用 p4 .Speak(); 虚函数虚函数 n定义:定义:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数 n语法语法:virtual 函数返回类型 函数名(参数表) 函数体 n用途:用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数, 虚函数实现多态性虚函数实现多态性 #include class Pet /基类基类public:virtual void Speak() coutHow does a pet speak ?en

43、dl; ; class Cat : public Pet /派生类派生类public:virtual void Speak() coutmiao!miao!endl; ; 虚函数的使用限制虚函数的使用限制 n应通过指针或引用调用虚函数,而不要以对象名应通过指针或引用调用虚函数,而不要以对象名调用虚函数调用虚函数说明语句说明语句n在派生类中重定义的基类虚函数仍为虚函数,同在派生类中重定义的基类虚函数仍为虚函数,同时可以省略时可以省略virtual关键字关键字 n不能定义虚构造函数,可以定义虚析构函数不能定义虚构造函数,可以定义虚析构函数 抽象类抽象类 n纯虚函数纯虚函数 virtual 返回类型

44、 函数名(参数表)=0 纯虚函数是为了实现多态性而存在,具体实现只能在派生类中完成。n抽象类抽象类 至少包含一个纯虚函数的类称为抽象类 抽象类为其所有子类提供了统一的操作界面,使其派生类具有一系列统一的方法。 抽象类的使用要求抽象类的使用要求 n抽象类不能实例化抽象类不能实例化 n抽象类只作为基类被继承抽象类只作为基类被继承 n可以定义指向抽象类的指针或引用可以定义指向抽象类的指针或引用 抽象宠物类的实现抽象宠物类的实现#include #include class Pet /基类基类char m_strName20;intm_nAge;char m_strColor12;public: ch

45、ar m_strType10;Pet(char *,int ,char *);char* GetName() return m_strName; int GetAge() return m_nAge; char* GetColor() return m_strColor; virtual void Speak() = 0; virtual void GetInfo() ;抽象宠物类的实现(续抽象宠物类的实现(续1)Pet:Pet(char *name,int age,char *color)strcpy(m_strName,name);m_nAge=age;strcpy(m_strColor,colo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论