- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c谭浩强教学第6章修的(周四学时)
第六章 多态性与虚函数
6.1 多态性概述
一、多态的分类
二、多态的实现
6.2一个典型的案例
6.3 虚函数
6.4 纯虚函数和抽象类
一、纯虚函数
二、抽象类
三、 程序举例
第六章 多态性与虚函数
6.1 多态性概述
所谓多态性是指:对于不同类的对象发出相同的消息将会有不同的实现。多态性也可以这样理解:在一般类中定义的属性或服务被特殊继承之后,可以具有不同的数据类型或不同的实现。
多态性的目的在于:用同样的接口访问不同功能的函数。
一、多态的分类
从系统实现的角度划分
静态多态性:在程序编译时,系统就能确定调用的是哪一个函数。如:函数重载和运算符重载等。
动态多态性:在程序运行过程中,系统才能动态的确定调用的是哪一个对象。
本章重点讲述的是:动态多态----虚函数。
二、多态的实现
编译时的多态性是通过静态联编实现的,而运行时的多态性是通过动态联编实现的。
所谓联编是指把函数名与函数体的程序代码连接在一起的过程。
1.静态联编
静态联编是指在程序编译连接阶段进行的联编,即编译器在程序开始运行前的编译阶段就确定程序所要进行的操作,从而调用固定的函数。
2.动态联编
动态联编是指程序运行时进行的联编,即指编译器在连接期间不知道程序所要进行的操作,在运行时才确定调用哪个函数。
6.2 一个典型的例子(P199)
例6.1 建立一个Point(点)类,包含数据x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle(圆)类为直接基类,派生出一个Cylinder(圆柱体)类,增加数据成员h(高)。要求编写程序,重载运算符““和””,使之能用于输出以上类对象。
(1)先声明基类Point(点)类
#include iostream.h
class Point //声明类Point
{public:
Point(float=0,float=0); //构造函数
void setPoint(float,float); //设置坐标值
float getX() const {return x;}
float getY() const {return y;}
friend ostream operator(ostream ,const Point );
protected:
float x,y;
};
//定义Point类的成员函数
//Point的构造函数
Point::Point(float a,float b)
{x=a;y=b;}
//设置x和y的坐标值
void Point::setPoint(float a,float b)
{x=a;y=b;}
//输出点的坐标
ostream operator(ostream output,const Point p)
{ output[p.x,p.y]endl;
return output;
}
int main()
{Point p(3.5,6.4);
coutx=p.getX(),y=p.getY()endl;
p.setPoint(8.5,6.8);
coutp(new):pendl;
return 0;
}
(2)声明派生类Circle(圆)类
在上面的基础上,增加声明派生类Circle类的部分
class Circle:public Point
{public:
Circle(float x=0,float y=0,float r=0);
void setRadius(float); //设置半径值
float getRadius() const; //读取半径值
float area () const; //计算圆面积
friend ostream operator(ostream ,const Circle );
private:
float radius; //半径
};
//定义构造函数,对圆心坐标和半径初始化
Circle::Circle(float a,float b,float r):
Point(a,b),radius(r){}
//设置半径值
void Circle::setRadius(float r)
{ radius=r; }
//读取半径值
float Circle::getRadius() const { return radius; }
//计算圆面积
float Circle::area() const
{ return 3.14159*radius*radius; }
//重载运算符“”
您可能关注的文档
- 两个大学生“摊主”的菜市情缘.doc
- 俱乐部日常管理试行办法.doc
- 东城小学课程管理方案.doc
- 业务员巧破拒绝的13种方法.doc
- 与客户有关过程控制程序.doc
- 专业技术职1.doc
- 上海立信会计信息实验.doc
- 上海团人大代表“严重关注”环保问题.doc
- 三种帮助睡眠的饮食方法.doc
- 何必限制洋奶粉?.doc
- (重庆卷)2023年中考地理第二次模拟考试(全解全析).pdf
- 2022届山西省晋城高平市重点中学中考语文适应性模拟试题含解析.pdf
- 高考英语总复习 题组层级快练(二).pdf
- 高中物理_《万有引力》试卷讲评教学设计学情分析教材分析课后反思.pdf
- (必考题)初中英语八年级上册 Unit 4经典练习卷(含答案解析).pdf
- 2022人教版数学三年级上册单元测试分数的初步认识(含答案)两套.pdf
- (2023年)吉林省吉林市【注册会计】公司战略与风险管理真题(含答案).pdf
- 马克思主义基本原理概论试题(10)及参考答案.pdf
- 2023-2024学年初中地理中图版八年级下第6章 认识地区单元测试(含答案解析).pdf
- 2023-2024学年广东省广州市南沙区九年级上学期期末质量检测物理试题.pdf
文档评论(0)