cc程序设计第10章-面向对象程序设计课件.ppt

上传人(卖家):三亚风情 文档编号:3514734 上传时间:2022-09-10 格式:PPT 页数:63 大小:1.76MB
下载 相关 举报
cc程序设计第10章-面向对象程序设计课件.ppt_第1页
第1页 / 共63页
cc程序设计第10章-面向对象程序设计课件.ppt_第2页
第2页 / 共63页
cc程序设计第10章-面向对象程序设计课件.ppt_第3页
第3页 / 共63页
cc程序设计第10章-面向对象程序设计课件.ppt_第4页
第4页 / 共63页
cc程序设计第10章-面向对象程序设计课件.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、C/C+程序设计 C/C+程序设计程序设计第第10章章 面向对象程序设计面向对象程序设计10.1 面向对象程序设计概述面向对象程序设计概述10.1.1 10.1.1 面向过程的程序设计面向过程的程序设计面向过程的程序设计其核心思想是:功能的分解。即将问题分解成若干个功能模块,根据模块功能设计用于存储数据的数据结构,编写函数对数据进行操作,从而实现模块功能。程序由处理数据的一系列函数构成,设计方法是面向过程的。程序可以被描述为:程序程序=模块模块+模块模块+模块模块 模块模块=数据结构数据结构+算法。算法。10.1 面向对象程序设计概述面向对象程序设计概述10.1.2 10.1.2 面向对象的程

2、序设计面向对象的程序设计面向对象程序设计是针对开发较大规模的程序而提出来的。它更接近于人的思维活动,不仅吸收了结构化程序设计的思想,而且又有效地改进结构化程序设计中存在的问题。面向对象方法认为现实世界是由一个个对象组成的,构成客观事物的基本单元是对象。解决某个问题时,先要确定这个问题是由哪些对象组成。程序可以被描述为:程序=对象+对象+对象 对象=数据结构+算法。抽象:对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。例对人类的抽象:共同的属性:姓名、性别、年龄等。共同的行为:生物性行为吃饭、睡觉等。社会性行为工作、学习等。10.1.3 10.1.3 面向对象程序设计的基本特

3、点面向对象程序设计的基本特点10.1 面向对象程序设计概述面向对象程序设计概述抽象封装 继承多态两个重点 将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机地结合,形成“类”。其中的数据和函数(方法)都是类的成员。抽象封装封装 继承多态10.1.3 10.1.3 面向对象程序设计的基本特点面向对象程序设计的基本特点10.1 面向对象程序设计概述面向对象程序设计概述 继承可以在别人认识的基础之上有所发现,有所突破,摆脱重复分析、重复开发的困境。C+语言中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体、更详细的说明。通过类的这种

4、层次结构,可以很好地反映出认识的发展过程。抽象封装 继承继承多态多态10.1.3 10.1.3 面向对象程序设计的基本特点面向对象程序设计的基本特点10.1 面向对象程序设计概述面向对象程序设计概述 多态:多个同名函数,由于参数的个数不同或者参数的类型不同,或进行提供函数的类不同,导致完成不同的功能。10.2 从从C到到C+10.2.1 10.2.1 C+对对C的一般扩充的一般扩充1.源程序文件扩展名 2.新增了关键字 3.2种强制类型转换方式 4.灵活的变量声明 5.C+的字符串类型(string类型)6.C+的输入cin与输出cout 7.头文件有无.h 后缀的区别10.2.2 10.2.

5、2 C+中的函数中的函数1.内联函数 2.函数重载 3.带默认参数值的函数10.3.1 10.3.1 类类 1.1.类的定义类的定义 class 类名类名 private:数据成员数据成员;成员函数成员函数;protected:数据成员数据成员;成员函数成员函数;public:数据成员数据成员;成员函数成员函数;;关键字与C语言的标识符命名规则一致例:class A private:int x;/数据成员数据成员;void f1();/成员函数成员函数;public:float y;/数据成员数据成员;char f2(int a);;注意定义类结束后的分号10.3 类与对象类与对象10.3.1

6、 10.3.1 类类 2.2.类成员的访问控制类成员的访问控制 10.3 类与对象类与对象类的成员包括数据成员和函数成员,分别描述问题的属性和行为。对类成员访问权限的控制是通过设置成员的访问属性而实现的。访问控制属性可以有以下三种:访问控制属性可以有以下三种:public公有类型 private 私有类型 protected 保护类型10.3.2 10.3.2 类的成员函数定义类的成员函数定义C+中的成员函数声明:返回值类型 类名:函数成员名(参数表)函数体对比对比C C中的函数声明:中的函数声明:返回值类型 函数名(参数表)函数体函数的原型声明可以写在类体中,也可以写在类之外,此处指明的是写

7、在类外格式函数的原型声明写在类体中的格式同C中的函数:域操作符特殊的成员函数(构造函数和析构函数)普通的成员函数:本节重点介绍例:class A private:int x;/数据成员数据成员;void f1()/成员函数成员函数;public:float y;/数据成员数据成员;char f2(int a);;char A:f2(int a);函数f2的原型声明写在类体之外函数f1的原型声明写在类体内。这种形式亦是内联函数的隐式定义。函数f2的原型声明写在类体之外。前使用inline即为内联函数。10.3.2 10.3.2 类的成员函数类的成员函数1.成员函数的定义内联成员函数-显示声明将函

8、数体的实现放在类体外。例:class class StudentStudent public:public:void Input();void Input();void Outputvoid Output();();private:private:;inline void Student:Output()inline void Student:Output()coutcoutnamename ;number;scorenumber;scoreendlendl;关键字,显示声明内联函数:域操作符10.3.2 10.3.2 类的成员函数类的成员函数2.成员函数的重载#include#include

9、 using namespace std;class Person private:string name;/姓名 char sex;/性别 int age;/年龄 public:void Walk()/走路 cout name 正在走路!endl;void Work()/工作 cout name 正在工作!endl;void Work(int days)/函数重载函数重载 cout name 已经工作了 days 天!endl;10.3.2 10.3.2 类的成员函数类的成员函数函数参数不同,实现重载。3.带默认形参值的成员函数#include#include using namespace

10、 std;class Person private:string name;/姓名 char sex;/性别 int age;/年龄 public:/其他成员函数省略 void Input(string n=zhang,char se=F,int a=20)name=n;sex=se;age=a;10.3.2 10.3.2 类的成员函数类的成员函数函数的形参带有默认值。10.3.3 10.3.3 对象的定义及引用对象的定义及引用10.3 类与对象类与对象(1)先定义类,再定义类的对象,即:class 类名 成员变量;成员函数;类名类名 类对象类对象1,类对象类对象2,;建立对象数组的格式如下:

11、类名类名 类对象数组名类对象数组名长度长度;1.对象的定义1.对象的定义(2)定义类的同时直接定义类的对象,即:class 类名 成员变量;成员函数;对象名列表;说明:对象名列表中的每个对象之间用逗号分隔。10.3.3 10.3.3 对象的定义及引用对象的定义及引用1.对象的定义(3)定义类的同时直接定义类的对象,并省去类名,即:class 成员变量;成员函数;对象名列表;说明:对象名列表中的每个对象之间用逗号分隔。10.3.3 10.3.3 对象的定义及引用对象的定义及引用(1)类对象数据成员访问格式:对象名.数据成员名 (2)类对象函数成员访问格式:对象名.成员函数名(实参列表)说明:“.

12、”是成员运算符;只有被定义为公有类型的成员才能在类的外面被访问到;在类的内部,所有成员都可以直接通过名称访问。2.对象的引用10.3.3 10.3.3 对象的定义及引用对象的定义及引用【例例10-8】定义Person类的对象。#include#include using namespace std;class Person private:string name;/姓名 char sex;/性别 int age;/年龄 public:void Walk()cout name 正在走路!endl;void Work()cout name 正在工作!endl;void Input(string n

13、=zhang,char se=F,int a=20)name=n;sex=se;age=a;p1;void main()p1.Input();p1.Work();10.3.3 10.3.3 对象的定义及引用对象的定义及引用定义类的同时直接定义了对象p1引用公有的成员函数【例例10-9】设计一个圆类,计算圆的周长和面积。#include /使用旧标准的头文件 class Circle public:double r;double Area()/在类体内实现的函数 return 3.14*r*r;double Peri();/类体中只有函数的声明;double Circle:Peri()/在类体外

14、实现的函数 return 2*3.14*r;void main()Circle c;c.r=3.78;/对数据成员 r 的写操作 cout 圆的半径是:c.r endl;/对数据成员 r 的读操作 cout 面积是:c.Area()“,周长是:c.Peri()endl;10.3.3 10.3.3 对象的定义及引用对象的定义及引用方法1:所有成员均为公有的,数据不安全直接引用公有的成员【例例10-9】设计一个圆类,计算圆的周长和面积。/使用新标准的头文件#include using namespace std;class Circle private:double r;public:/在类体内实

15、现的函数 double Area()return 3.14*r*r;double GetR()return r;/在类体外实现的函数 double Peri();void SetR(double x);c;/在类体外实现的函数double Circle:Peri()return 2*3.14*r;void Circle:SetR(double x)r=x;10.3.3 10.3.3 对象的定义及引用对象的定义及引用方法2:数据成员为私有的,提供公有的成员函数对数据进行操作void main()/调用成员函数完成对数据成员 r 的写操作 c.SetR(3.78);/调用成员函数完成对数据成员 r

16、 的读操作 cout 圆的半径是:c.GetR()endl;/对成员函数的调用 cout 面积是:c.Area();cout,周长是:c.Peri()endl;只引用公有的成员函数10.4.1 10.4.1 构造函数构造函数10.4 析造函数和析构函数析造函数和析构函数特殊性体现在:特殊性体现在:构造函数的函数名与类名相同;构造函数没有返回值;构造函数不能调用,而是在建立对象建立对象时自动执行。构造函数的作用:构造函数的作用:在对象被创建时利用特定的值构造对象,将对象初始化为特定的状态,实际上将对象中的数据成员初始化为特定状态。【例例10-10】对于上述圆类,使用构造函数设置半径值。#incl

17、ude class Circle private:double r;public:/在类体内实现的构造函数在类体内实现的构造函数 Circle(double x)r=x;double Area()return 3.14*r*r;double Peri();void SetR(double x);double GetR()return r;10.4.1 10.4.1 构造函数构造函数方法一:构造函数写在类体内部double Circle:Peri()return 2*3.14*r;void Circle:SetR(double x)r=x;void main()/在创建对象时自动调用构造函数在创

18、建对象时自动调用构造函数 Circle c(3.78);/调用成员函数完成对数据成员 r 的读操作 cout 圆的半径是:c.GetR()endl;/对成员函数的调用 cout 面积是:c.Area();cout,周长是:c.Peri()endl;【例例10-10】对于上述圆类,使用构造函数设置半径值。#include class Circle private:double r;public:/在类体内只声明构造函数在类体内只声明构造函数 Circle(double r=5.12);double Area()return 3.14*r*r;double Peri();void SetR(dou

19、ble x);double GetR()return r;/在类体外实现的构造函数在类体外实现的构造函数Circle:Circle(double r)this-r=r;10.4.1 10.4.1 构造函数构造函数方法二:在类体内部只声明构造函数,在类体外实现构造函数方法二:在类体内部只声明构造函数,在类体外实现构造函数double Circle:Peri()return 2*3.14*r;void Circle:SetR(double x)r=x;void main()/在创建对象时自动调用构造函数在创建对象时自动调用构造函数 Circle c(3.78);/调用成员函数完成对数据成员 r 的

20、读操作 cout 圆的半径是:c.GetR()endl;/对成员函数的调用 cout 面积是:c.Area();cout,周长是:c.Peri()endl;/在创建对象时自动调用构造函数,且使用默认参数在创建对象时自动调用构造函数,且使用默认参数 Circle d;cout 圆的半径是:d.GetR()endl;cout 面积是:d.Area(),周长是:d.Peri()endl;【例例10-11】在Person类中加入构造函数,使用构造函数创建Person类对象。#include#include using namespace std;class Person private:string

21、name;/姓名 char sex;/性别 int age;/年龄 public:/无参构造函数无参构造函数 Person()name=;sex=F;age=18;/有参构造函数有参构造函数 Person(string name,char sex,int age)this-name=name;this-sex=sex;this-age=age;10.4.1 10.4.1 构造函数构造函数构造函数重载 void Work()/工作 cout name 正在工作!name=name;this-sex=sex;this-age=age;void main()Person p1(liying,F,21

22、);p1.Work();当函数的参数名与类的数据成员同名时,对数据成员的访问需要使用this指针当函数的参数名与类的数据成员同名时,对数据成员的访问需要使用this指针特殊性体现在:特殊性体现在:析构函数的函数名与类名基本相同,在类名前加符号;析构函数没有返回值;析构函数不能调用,而是在删除删除对象对象时自动执行。析构析构函数函数的作用:的作用:完成对象被删除前的清理工作。它在对象的生存期即将结束时被自动调用,调用完成后,对象被删除,相应的内存空间被释放。10.4.2 10.4.2 析构函数析构函数10.4 析造函数和析构函数析造函数和析构函数【例例10-12】析构函数实例。#include#

23、include using namespace std;class MyString private:char *str;public:MyString(char *s)/构造函数 cout 构造函数被调用!创建一个字符串 endl;str=new char strlen(s)+1 ;strcpy(str,s);MyString()/析构函数析构函数 cout 析构函数被调用析构函数被调用!删除这个字符串删除这个字符串 endl;delete str;void Display()cout -显示这个字符串-endl;cout 字符串为:str endl;int main()MyString m

24、y(liying);my.Display();return 0;10.4.2 10.4.2 析构函数析构函数析构函数运行程序,输出:运行程序,输出:10.5.1 10.5.1 静态数据成员静态数据成员10.5 静态成员静态成员 静态数据成员静态数据成员是一种特殊的数据成员。是一种特殊的数据成员。(1)它以关键字它以关键字static开头。开头。(2)一个类的静态数据成员仅创建和初始一个类的静态数据成员仅创建和初始化一次,且在程序开始执行的时候创建,然后化一次,且在程序开始执行的时候创建,然后被该类的所有对象共享;而非静态的数据成员被该类的所有对象共享;而非静态的数据成员则随着对象的创建而多次创

25、建和初始化。则随着对象的创建而多次创建和初始化。【例例10-13】静态数据成员应用举例。#include using namespace std;class Student static int count;int stuNumber;public:Student()count+;stuNumber=count;void Display()cout 学号:stuNumber ;cout 总人数:count endl;/给静态数据成员赋初值给静态数据成员赋初值int Student:count=0;10.5.1 10.5.1 静态数据成员静态数据成员静态数据成员使用静态数据成员时,需用:类名:静

26、态成员名类名:静态成员名int main()cout “-第1次输出-n;Student s1;s1.Display();cout “-第2次输出-n;Student s2;s1.Display();s2.Display();cout “-第3次输出-n;Student s3;s1.Display();s2.Display();s3.Display();return 0;10.5.2 10.5.2 静态成员函数静态成员函数10.5 静态成员静态成员 在类中声明的函数前加上static关键字,该函数就成为了静态成员函数。如果要在类外调用公有的静态成员函数,同样可用“类名:”访问。格式如下:类名类

27、名:静态成员函数名(实参表)静态成员函数名(实参表)【例例10-14】静态成员函数应用举例。#include using namespace std;class Student int stuNumber;float score;static int count;static float sum;public:Student(int stuNumber,float score)this-stuNumber=stuNumber;this-score=score;void total();/声明普通成员函数 /声明静态成员函数声明静态成员函数 static float average();void

28、 Student:total()sum+=score;/累加总分 count+;/累计已统计的人数/定义静态成员函数定义静态成员函数float Student:average()return sum/count;/计算平均分10.5.2 10.5.2 静态成员函数静态成员函数静态数据成员/给静态数据成员赋初值给静态数据成员赋初值int Student:count=0;float Student:sum=0;int main()Student stud3=Student(1001,70),Student(1002,78),Student(1005,98);for(int i=0;i 3;i+)s

29、tud i .total();/通过类名调用静态成员函数通过类名调用静态成员函数 cout 平均成绩是:Student:average()endl;/通过对象名调用公有静态成员函数通过对象名调用公有静态成员函数 cout 平均成绩是:stud2.average()name=name;this-sex=sex;this-age=age;void Disp()coutname,sex,age department=department;this-salary=salary;void Disp_Teacher()coutdepartment,salary department=department;

30、this-salary=salary;void Disp()cout department ,salary name=name;this-sex=sex;this-age=age;/编译出错编译出错 this-department=department;this-salary=salary;void Disp()cout name ,sex ,age endl;/编译出错编译出错 cout department ,salary department=department;this-salary=salary;void Disp()Person:Disp();/编译通过编译通过 cout dep

31、artment ,salary department=department;this-salary=salary;void Disp_Teacher()cout department ,salary department=department;this-salary=salary;void Disp()Person:Disp();/编译通过编译通过,可访问自己任何成员,可访问自己任何成员 cout department ,salary endl;int main()Teacher tc;tc.Init(liying,F,20,CS,3240);tc.Disp();return 0;10.6.1

32、 10.6.1 类的继承与派生类的继承与派生10.6.1 10.6.1 类的继承与派生类的继承与派生3.3.派生类继承方式派生类继承方式-(3 3)保护继承)保护继承:protected:protected 这种方式下,基类的公有成员和保护成员都是派生类的保护成员;基类的私有成员仍然是派生类的私有成员,仍然只有基类的成员函数可以访问它们。即当继承方式为protected时,派生类的对象不能访问基类中以任何方式定义的成员。10.6.1 10.6.1 类的继承与派生类的继承与派生10.6 继承与派生继承与派生 3.派生类的三种继承方式派生类的三种继承方式继承方式继承方式基类中的访问权限基类中的访问

33、权限派生类中的访问权限派生类中的访问权限公有继承公有继承publicpublicpublicprotectedprotectedprivate不可访问私有继承私有继承privatepublicprivateprotectedprivateprivate不可访问保护继承保护继承protectedpublicprotectedprotectedprotectedprivate不可访问访访问问特特性性10.6.1 10.6.1 类的继承与派生类的继承与派生10.6 继承与派生继承与派生 4.类型兼容规则类型兼容规则(1)派生类的对象可以赋值给基类对象 例如,Person类和其派生类Teacher类:

34、Person p;Teacher tc;tc.Init(liying,F,20,CS,3240);p=tc;/派生类的对象可以赋值给基类对象派生类的对象可以赋值给基类对象(2)派生类的对象可以初始化基类的引用 Person p2=tc;/用派生类对象初始化基类对象用派生类对象初始化基类对象(3)派生类对象的地址可以赋给指向基类的指针 Person *p3=NULL;p3=&tc;10.6.2 10.6.2 派生类的构造函数和析构函数派生类的构造函数和析构函数10.6 继承与派生继承与派生 C+中,定义一个对象时可以利用构造函数设置类数据成员的初值,利用析构函数释放分配给对象的存储空间,这也是所

35、有面向对象程序设计语言的通用做法。但是,派生类不能继承基类的构造函数和析构函数派生类不能继承基类的构造函数和析构函数,因此在派生类中,要对派生类新增的成员进行初始化,就需要重新加入新的构造函数,如果需要对基类的数据成员设置初值,可以调用基类的构造函数可以调用基类的构造函数。10.6.2 10.6.2 派生类的构造函数和析构函数派生类的构造函数和析构函数10.6 继承与派生继承与派生 1.构造和析构的次序构造和析构的次序执行基类的构造函数执行派生类的构造函数执行派生类的析构函数执行基类的析构函数创建派生类对象时撤销派生类对象时【例例10-20】基类和派生类的构造函数和析构函数执行顺序实例。#in

36、clude using namespace std;class Base public:Base()/基类构造函数 cout 基类的构造函数 endl;Base()/基类析构函数 cout “基类的析构函数 ”endl;class Derived :public Base /派生类公有继承基类 public:Derived()/派生类构造函数 cout *派生类的构造函数*endl;Derived()/派生类析构函数 cout *派生类的析构函数*endl;int main()Derived obj;return 0;10.6.2 10.6.2 派生类的构造函数和析构函数派生类的构造函数和析构

37、函数运行结果:运行结果:10.6.2 10.6.2 派生类的构造函数和析构函数派生类的构造函数和析构函数10.6 继承与派生继承与派生 2.派生类构造函数的构造规则派生类构造函数的构造规则 如果基类没有显式定义构造函数,或者定义的构造函数没有参数,派生类可以不向基类传递参数,甚至可以不定义构造函数,而采用默认的构造函数。但如果基类定义了带有参数的构造函数,派生类就必须定义构造函数,通过构造函数将参数传递给基类的构造函数。C+中,派生类构造函数的一般格式如下:派生类构造函数名派生类构造函数名(参数表参数表):基类构造函数名:基类构造函数名(参数表参数表);【例例10-21】派生类构造函数调用基类

38、构造函数,为基类构造函数传递参数的实例。#include using namespace std;class Base private:int x;public:Base(int a)cout基类构造函数:endl;x=a;Base()cout基类析构函数:endl;void ShowX()cout x endl;10.6.2 10.6.2 派生类的构造函数和析构函数派生类的构造函数和析构函数class Derived:public Base private:int y;public:Derived(int a,int b):Base(a)cout派生类构造函数:endl;y=b;Derive

39、d()cout派生类析构函数:endl;void ShowY()cout y endl;int main()Derived obj(10,20);obj.ShowX();obj.ShowY();return 0;10.6.3 10.6.3 多重继承多重继承10.6 继承与派生继承与派生 在派生类的定义中只有一个基类名,这种继承方式叫单继承单继承。在派生类的定义中可以有多个基类名,基类名之间用逗号分开,这种继承方式叫多重多重继承继承。C+允许多继承。C#、Java只允许单继承。10.7.1 10.7.1 多态性概述多态性概述10.7 多态性多态性 在面向对象方法中描述的多态一般是:向不同的对象发

40、送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每一个对象可以用自己的方式去响应共同的消息。C+中,多态的实现方式分两种,一种是在编译时出现在编译时出现的多态性,也称为静态多态性静态多态性;一种是在运行时出现在运行时出现的多态性,也称为动态多态性动态多态性。10.7.2 10.7.2 函数重载函数重载10.7 多态性多态性 编译时的多态性可以通过函数重载来实现。函数重载有两种情况:函数参数不同 函数属于不同的类10.7.2 10.7.2 函数重载函数重载10.7 多态性多态性 void fun(int a)void fun(int a,int b)void fun(flo

41、at a)1.1.函数参数有所差别的重载函数参数有所差别的重载fun(3)、fun(3.0)、fun(3,2)这这3次次调用调用分别执行的是哪个?分别执行的是哪个?参数的个数或类型参数的个数或类型不相同不相同10.7.2 10.7.2 函数重载函数重载10.7 多态性多态性class Base public:fun()/基类中的fun()函数 ;class Derived:public Base public:fun()/派生类中的fun()函数 ;int main()Base b;Derived d;b.fun();d.fun();d.Base:fun();return 0;2.函数所带参数

42、完全相同,但它们属于不同的类函数所带参数完全相同,但它们属于不同的类参数的个数或类型参数的个数或类型完全相同完全相同10.7.3 10.7.3 虚函数虚函数10.7 多态性多态性 虚函数是在基类中定义的用关键字virtual说明,并在派生类中重新定义的函数。在派生类中重新定义时,其函数原型(包括返回类型、函数原型(包括返回类型、函数名、函数参数的个数与参数类型的顺序)都必须与基函数名、函数参数的个数与参数类型的顺序)都必须与基类中的原型完全相同类中的原型完全相同。1.1.虚函数的定义虚函数的定义【例例10-22】使用虚函数实现动态多态性的实例。#include using namespace

43、std;class Base private:int x;public:Base(int a)x=a;virtual void Show()/定义虚函数定义虚函数 cout Base-n x endl;class Derived :public Base /派生类公有继承基类 private:int y;public:Derived(int a,int b):Base(a)y=b;void Show()/重新定义虚函数重新定义虚函数 cout Derived-n y Show();p=&obj2;p-Show();return 0;10.7.3 10.7.3 虚函数虚函数运行结果:运行结果:说

44、明:1)在基类中,用关键字virtual可以将其public或protected部分的成员函数声明为虚函数。在派生类对基类中声明的虚函数进行重新定义时,关键字virtual可以写也可以不写。2)虚函数被重新定义时,其函数的原型与基类中的函数原型必须完全相同。3)一个虚函数无论被公有继承多少次,它仍然保持虚函数的特性。4)只有类的成员函数才能被定义为虚函数,且该成员函数不能是友元函数或静态成员函数。5)一个成员函数被声明为虚函数后,在同一类族中的类就不能定义一个非virtual的但与该虚函数具有相同参数和函数返回值类型的同名函数。6)virtual只能用于函数的原型声明中,不能用在函数的实现中。

45、10.7.3 10.7.3 虚函数虚函数10.7.4 10.7.4 纯虚函数和抽象类纯虚函数和抽象类10.7 多态性多态性 1.1.纯虚函数纯虚函数 纯虚函数是没有函数体的函数。声明纯虚函数的一般形式如下:virtual 函数类型函数类型 函数名函数名(参数表参数表)=0;纯虚函数只有函数的名字而不具备函数的功能,不能被调用。只有在派生类中对此函数提供定义后,它才能具备函数功能,才能可以被调用。纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。如果在基类中没有保留函数名字,则无法实现多态性。如果一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。10.7.4 10.7.4 纯虚函数和抽象类纯虚函数和抽象类10.7 多态性多态性 带有纯虚函数的类就是抽象类,抽象类的唯一用途就是被继承。一个抽象类至少具有一个纯虚函数。如果一个抽象类的派生类没有实现来自基类的某个纯虚函数,则该函数在派生类中仍然是纯虚函数,这就使得该派生类也成为抽象类。2.抽象类抽象类

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

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

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


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

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


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