谭浩强编著 C++面向对象程序设计 授课教师:姬广永 学习网站:

Slides:



Advertisements
Similar presentations
高一七班 研究性学习小组 当我们正为寻找什么课 题而烦恼时,忽见一 精光从我面前闪过。 艾玛,原来是我同桌 眼镜反射,自此 “ 眼镜 ” 这课题被我付诸行动。 我们为此进行了研究 讨论学习 下图为组员在查阅资料.
Advertisements

科学就医健康教育核心信息 健康中国行·科学就医 一、倡导科学就医 二、遵从分级诊疗 三、定期健康体检 四、鼓励预约挂号 五、就医注意事项
第 9 章 物件的建構.
★中国近代史: 1840年————1949年 鸦片战争 新中国诞生 ★历史线索: 1、资本主义列强对中国的侵略 2、中国人民的反抗和探索:
项目7 面向对象高级.
这是一个数字的 乐园 这里埋藏着丰富的 宝藏 请跟我一起走进数学的 殿堂.
高等数学绪论 一、《高等数学》学什么? 二、《高等数学》培养学生那些能力? 三、如何考硕士研究生? 四、全国大学生数学建模竞赛是怎么回事?
证券交易模拟 第2讲 交易规则与盘面术语.
第四章 继承与派生 Chapter 4 Inheritance and Derivation
四資二甲 第三週作業 物件導向程式設計.
學校:光春國中 班級:七年三班 製作團隊: 顏序芳 李邰岳 謝宜軒
总资金流向 资金流出:上期所、大商所、郑商所所有品种主力合约持仓资金变化情况
第一章 面向对象程序设计.
1.1.2 四 种 命 题.
第九讲 类与对象 (I)面向对象基础.
第6章 多态性与虚函数.
课标教材下教研工作的 实践与思考 山东临沂市教育科学研究中心 郭允远.
類別與物件 Class & Object.
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
Ch07 介面與多重繼承 物件導向程式設計(II).
第八章 类和对象.
JAVA程序设计 (03) JAVA Programming
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
面向对象技术 练习2 ffh.
CHAPTER 9 建構方法 ROBERT.
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
第六章 面向对象程序设计基础 6.1 面向对象程序设计概述 6.2 结构 6.3 类和对象 6.4 继承和派生 6.5多态性
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第 6 章 函式.
類別的繼承 Vehicle Car.
第二章 C++对C 在非面向对象方面的改进 更简洁,更安全.
第四章 小技巧.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C/C++/Java 哪些值不是头等程序对象
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 QQ: 学习网站:
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第12讲 多继承与虚基类 多继承 虚基类.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第16章 数据的共享和流通 一、浅拷贝和深拷贝 二、只读成员函数 三、友元friend.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第三章 数据抽象.
C语言程序设计 李祥 QQ:
Object-Oriented Programming in C++ 第二章 类和对象
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
面向对象技术 练习 ffh.
第二章 类型、对象、运算符和表达式.
C++程序设计基础 主讲人:谢昕 华东交通大学信息工程学院 第十~十二讲 多态性和虚函数 2005年春季学期.
第九章 物件導向-進階.
第 9 章 建構函式與解構函式.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
家長日 學校名稱 日期.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第三章 高级函数特性.
第4讲 类和对象、异常处理 ggao.
三、 动量和角动量 1 、 质点动量定理 动量 冲量.
Presentation transcript:

谭浩强编著 C++面向对象程序设计 授课教师:姬广永 学习网站:http://www.xin126.cn

第六章多态性与虚函数 多态性的概念 一个典型的例子 虚函数 纯虚函数与抽象类 http://www.xin126.cn

第六章多态性与虚函数 什么叫多态? 多态的意思是一个事物有多种形态。 在C++中,是指具有不同功能的函数可以用同一个函数名。 面向对象程序设计中:多态性是指向不同的对象发送同一个消息,不同对象在接收时会产生不同的行为。不同的行为就是指不同的实现方法,即执行不同的函数体。 http://www.xin126.cn

虚函数:运行时的多态性 编译时的多态性(函数重载) 运行时的多态性(虚函数) 多态性 运行时的多态性是指在程序执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定 http://www.xin126.cn

编译时的多态性(函数重载) int add(int x, int y) { return x+y; }   double add(double a, double b)   {   return a+b; } int main()   { cout<<add(5, 10) <<endl;    cout<<add(5.0, 10.5) <<endl;   } http://www.xin126.cn

一个典型的例子 class A{ public: void show() { cout<<"A"<<endl; } }; class B:public A { public: void show() { cout<<"B"<<endl; } class C:public B { public: void show() { cout<<"C"<<endl; } http://www.xin126.cn

int main() { C c; c.show(); c.B::show(); c.A::show(); } http://www.xin126.cn

虚函数的作用 c.show(); c.B::show(); c.A::show(); 用这种方法来区分同名函数,不方便。 提出设想:(通过同一种形式达到不同目的) 能否用同一个调用形式,如pt->show();既能调用派生类的函数,又能调用基类的同名函数。 http://www.xin126.cn

pt=&b; pt->show(); class A{ public: void show(){ cout<<"A"; } }; class B:public A { void show(){ cout<<"B"; } int main() { A a, *pt; B b; pt=&a; pt->show(); pt=&b; pt->show(); } http://www.xin126.cn

pt= &b; pt ->Show(); pt pt只能引用从基类继承来的成员。 A a,*pt; pt=&a; pt 可以将一个派生类对象的地址赋给基类的指针变量。 基类指针 pt只能引用从基类继承来的成员。 A a,*pt; pt=&a; 派生类对象 pt= &b; pt ->Show(); 派生类对象 b 基类对象a pt pt Show() Show() Show() pt->Show() http://www.xin126.cn

运行时的多态性(虚函数) 虚函数的作用:是允许在派生类中重新定义与基类同名的函数,并且可以通过基类的指针或引用来访问基类和派生类中的同名函数。 http://www.xin126.cn

虚函数的定义 定义虚函数的方法如下: virtual 函数类型 函数名(形参表) { // 函数体 } // 函数体 } c++规定:当一个成员函数声明为虚函数后,其派生类中的同名函数都自动成为虚函数。在派生类中重新定义基类中的虚函数时,可以不用关键字virtual来修饰这个成员函数 。 http://www.xin126.cn

pt=&b; pt->show(); class A{ public: virtual void show(){ cout<<"A"; } }; class B:public A { void show(){ cout<<"B"; } int main() { A a, *pt; B b; pt=&a; pt->show(); pt=&b; pt->show(); } http://www.xin126.cn

虚函数与重载函数的区别 在一个派生类中重新定义基类的虚函数是函数重载的另一种形式,但它不同于一般的函数重载。 ◆ 普通的函数重载:函数名相同,参数不同(参数个数或类型不同)。 ◆ 当重载一个虚函数时,也就是说在派生类中重新定义虚函数时,要求函数名、返回类型、参数个数、参数的类型和顺序与基类中的虚函数原型完全相同。 ◆ 如果仅仅返回类型不同,其余均相同,系统会给出错误信息; ◆若仅仅函数名相同,而参数个数或类型不同,系统将它作为普通的函数重载,这时将丢失虚函数的特性。 http://www.xin126.cn

虚函数的限制: 1.必须是成员函数 2.不能是静态成员函数 3.不能是inline函数 4.构造函数不能是虚函数 http://www.xin126.cn

纯虚函数和抽象类 纯虚函数: 是一个在基类中说明的虚函数,只有函数声明,没有函数体,不能被调用。 纯虚函数的定义形式如下: virtual 函数类型 函数名(参数表)=0; “=0 ”不表示函数的返回值为0,它只起形式上的作用,告诉编译系统“这是虚函数”,它的实现留给派生类去定义。 http://www.xin126.cn

virtual void show()=0; // 纯虚函数 纯虚函数的使用: class Circle { protected: int r; public: void setr(int x){ r=x; } virtual void show()=0; // 纯虚函数 }; class Area:public Circle{ public: void show() { cout<<"Area is "<<3.14*r*r<<endl;} }; // 重定义虚函数show( ) class Perimeter:public Circle{ void show() {cout<<"Perimeter is "<<2*3.14*r<<endl;} }; // 重定义虚函数show( ) http://www.xin126.cn

void main() { Circle *ptr; Area ob1; Perimeter ob2; ob1.setr(10); ptr=&ob1; ptr->show(); ptr=&ob2; } http://www.xin126.cn

6.4 抽象类 如果一个类包含纯虚函数,那么就称该类为抽象类。 抽象类只能作为其他类的基类来使用 不能建立抽象类对象 6.4 抽象类 如果一个类包含纯虚函数,那么就称该类为抽象类。 抽象类只能作为其他类的基类来使用 不能建立抽象类对象 http://www.xin126.cn

例 8-5 void display(){cout<<"C::display()"<<endl;} class A //抽象基类B0声明 { public: //外部接口 virtual void display( ) =0; //纯虚函数成员 }; class B: public A //公有派生 { public: void display(){cout<<"B::display()"<<endl;} class C: public A //公有派生 void display(){cout<<"C::display()"<<endl;} http://www.xin126.cn

p->display(); //调用派生类B函数成员 p= &c; p->display(); //调用派生类C函数成员 } int main() //主函数 { A *p; //声明抽象基类指针 B b; //声明派生类对象 C c; //声明派生类对象 p=&b; p->display(); //调用派生类B函数成员 p= &c; p->display(); //调用派生类C函数成员 } http://www.xin126.cn 21

抽象类的作用: 抽象类为抽象和设计的目的而声明,是更高层次的抽象。 将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为。 如抽象基类shape(包含纯虚函数draw())派生出4个类:Square(正方形)、Circle、Rectangle(矩形)、Triangle(三角形),各个派生类定义自己的draw函数,作用分别是在屏幕上画出正方形、圆、矩形、三角形。 http://www.xin126.cn

抽象类的作用:代码重用 、灵活 class ring { public: virtual void Set ( ) =0; } ; …… public: virtual void Set ( ) =0; } ; class diamond_ring :public ring { void Set ( ){…} } class jewel _ring :public ring 抽象类限制了戒指的部分特性,也预留了部分灵活性 http://www.xin126.cn

课后习题P219 4. http://www.xin126.cn