第6章 多态性与虚函数.

Slides:



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

项目7 面向对象高级.
高等数学绪论 一、《高等数学》学什么? 二、《高等数学》培养学生那些能力? 三、如何考硕士研究生? 四、全国大学生数学建模竞赛是怎么回事?
慶鴻機電工業股份有限公司 公司地址:台中市南屯區精科一路三號 資 本 額:新台幣46,000萬元 董 事 長:王武雄
第四章 继承与派生 Chapter 4 Inheritance and Derivation
四資二甲 第三週作業 物件導向程式設計.
愛之花.
第九讲 类与对象 (I)面向对象基础.
----银行间的比较 论资本构成与充足率 淡 彩 的 黑 板 淡 彩 的 黑 板 金融73班 王艺霏 王 英
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
第7单元 面向过程编程—— 继承与多态.
第八章 类和对象.
第6章 多态性与虚函数.
第三章 控制结构.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
面向对象技术 练习2 ffh.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
第六章 面向对象程序设计基础 6.1 面向对象程序设计概述 6.2 结构 6.3 类和对象 6.4 继承和派生 6.5多态性
第3章 继承和派生.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第八章 类与对象 本章要求: 掌握类的含义与定义格式。 掌握类的无参构造函数、带参构造函数、拷贝构造函数和赋值重载函数的定义格式及作用。
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
第四章 小技巧.
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
資訊學科中心研習 JAVA程式設計專題 臺北市立大理高級中學 黃世隆 2019/2/23.
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
电子电路课程设计 TEL:025-
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 QQ: 学习网站:
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第12讲 多继承与虚基类 多继承 虚基类.
C语言复习3----指针.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
C++复习2----类与对象.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第三章 数据抽象.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
Object-Oriented Programming in C++ 第二章 类和对象
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
面向对象技术 练习 ffh.
C++程序设计基础 主讲人:谢昕 华东交通大学信息工程学院 第十~十二讲 多态性和虚函数 2005年春季学期.
本节内容 对象拷贝 视频提供:昆山爱达人信息技术有限公司.
本节内容 引用类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第九章 物件導向-進階.
第1章 C++面向对象程序设计要点 1.1 函数和函数参数 1.2 输入输出   1.3 类 1.4 抽象类型和模板.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第 5 章 继承、多态和虚函数 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
谭浩强编著 C++面向对象程序设计 授课教师:姬广永 学习网站:
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
Class 2005/05/25.
JAVA 程式設計與資料結構 第三章 物件的設計.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
本节内容 在堆中创建对象 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
Presentation transcript:

第6章 多态性与虚函数

6.1 多态性概述 所谓多态性就是不同对象收到相同的消息时,产生不同的动作。 直观地说,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。

6.1.1 多态的分类 C++中的多态性可以分为四类: 参数多态 包含多态 重载多态 强制多态。 前面两种统称为通用多态,而后面两种统称为专用多态。

6.1.2多态的实现 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。 编译时的多态是通过静态联编来实现的。静态联编就是在编译阶段完成的联编。编译时多态性主要是通过函数重载和运算符重载实现的。 运行时的多态是用动态联编实现的。动态联编是运行阶段完成的联编。运行时多态性主要是通过虚函数来实现的。

6.2 虚函数 虚函数提供了一种更为灵活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的动态联编。 6.2.1 虚函数的引入

例6.1 虚函数的引例1。 #include<iostream.h> class A{ public: void show(){ cout<<"A"; } }; class B:public A { void show(){ cout<<"B"; } main() { A a,*pc; B b; pc=&a; pc->show(); pc=&b; pc->show(); return 0; }

6.2.2 虚函数的作用和定义 1.虚函数的作用 虚函数同派生类的结合可使C++支持运行时的多态性,实现了在基类定义派生类所拥有的通用接口,而在派生类定义具体的实现方法,即常说的“同一接口,多种方法”,它帮助程序员处理越来越复杂的程序。

例6.3 虚函数的作用。 #include<iostream.h> class Base { public: Base(int x,int y) { a=x; b=y; } virtual void show() //定义虚函数show() { cout<<"Base----------\n"; cout<<a<<" "<<b<<endl;} private: int a,b; }; class Derived : public Base { Derived(int x,int y,int z):Base(x,y){c=z; } void show() //重新定义虚函数show() { cout<< "Derived---------\n"; cout<<c<<endl;} int c; };

void main() { Base mb(60,60),*pc; Derived mc(10,20,30); pc=&mb; pc->show(); //调用基类Base的show()版本 pc=&mc; pc->show(); //调用派生类Derived的show()版本 } 程序运行结果如下: Base--------- 60 60 Derived-------- 30

2. 虚函数的定义 定义虚函数的方法如下: virtual 函数类型 函数名(形参表) { // 函数体 }

例6.4 虚函数的定义举例。 #include<iostream.h> class Grandam { public: virtual void introduce_self() // 定义虚函数introduce_self() { cout<<"I am grandam."<<endl; } }; class Mother:public Grandam { void introduce_self() // 重新定义虚函数introduce_self() { cout<<"I am mother."<<endl;} class Daughter:public Mother { { cout<<"I am daughter."<<endl;}

void main() { Grandam *ptr; Grandam g; Mother m; Daughter d; ptr=&g; ptr->introduce_self();//调用基类Grandam的introduce_self() ptr=&m; ptr->introduce_self();// 调用派生类Mother的introduce_self() ptr=&d; ptr->introduce_self(); //调用派生类 // Daughter的introduce_self() }

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

6.3 纯虚函数和抽象类 6.3.1 纯虚函数 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但要求在它的派生类中必须定义自己的版本,或重新说明为纯虚函数。 纯虚函数的定义形式如下: virtual 函数类型 函数名(参数表)=0;

例6.9纯虚函数的使用。 #include<iostream.h> class Circle { public: void setr(int x){ r=x; } virtual void show()=0; // 纯虚函数 protected: int r; }; class Area:public Circle{ 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( )

void main() { Circle *ptr; Area ob1; Perimeter ob2; ob1.setr(10); ob2.setr(10); ptr=&ob1; ptr->show(); ptr=&ob2; }

6.3.2 抽象类 如果一个类至少有一个纯虚函数,那么就称该类为抽象类。 6.3.2 抽象类 如果一个类至少有一个纯虚函数,那么就称该类为抽象类。 抽象类只能作为其他类的基类来使用,不能建立抽象类对象,其纯虚函数的实现由派生类给出。