欢迎来到天天文库
浏览记录
ID:39319690
大小:949.00 KB
页数:24页
时间:2019-06-30
《多态性与虚函数1》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第6章多态性与虚函数多态性的概念虚函数纯虚函数与抽象类数学科学学院:汪小平wxiaoping325@163.com一、多态性的概念观察下图,识别其中所使用的元素。一、多态性的概念classNode{public:voidDraw(Graphics&graph);//画布类voidOffset(SizeF&size);.......................................................protected:....................................................
2、....};classStaff{public:voidDraw(Graphics&graph);voidOffset(SizeF&size);.......................................................protected:........................................................};一、多态性的概念classShape{public:voidDraw(Graphics&graph);//graph是传递过去的画布voidOffset(SizeF&s
3、ize);.......................................................protected:........................................................};classNode:publicShape{........................................................};classStaff:publicShape{................................................
4、........};修改后的类结构(具有抽象类)。一、多态性的概念考虑这些图形元素的存储方式。Shapem_graph[N];一、多态性的概念Shape*m_graph[N];………………………for(inti=0;iDraw(graph);考虑下面这段程序,它的输出结果可能会是怎样的?怎么区分指针存储的是哪一类对象地址?Shape*m_graph[N];………………………for(inti=0;iDraw(graph);else((Staff*
5、)m_graph[i])->Draw(graph);}一、多态性的概念这种编程方式不简洁,程序可读性不强,可以使用C++提供的虚函数,这样使得代码非常简单。classShape{public:virtualvoidDraw(Graphics&graph);virtualvoidOffset(SizeF&size);.......................................................protected:........................................................
6、};classNode:publicShape{..............//重新实现Draw和Offset函数};classStaff:publicShape{..............//重新实现Draw和Offset函数};一、多态性的概念Shape*m_graph[N];………………………for(inti=0;iDraw(graph);程序在运行时自动识别指针所指向的对象类型,从而调用该对象重写的虚函数,实现运行时的多态性。多态性分两种:静态多态性和动态多态性。程序在编译时就能确定应该调用哪个函数,称为
7、静态(或编译时的)多态性,比如:函数重载和运算符重载;程序在运行过程中才能动态地确定操作所针对的对象,称为动态多态性。这时通过虚函数实现。二、虚函数虚函数是动态绑定的基础。虚函数是非静态的成员函数,静态成员函数、内置成员函数和构造函数都不能说明为虚函数。声明方式:在函数原型之前写virtual,但函数实现时不能再写。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。虚函数本质:不是重载、屏蔽,而是覆盖。调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类类型,决定调用哪个函数。二、虚函数#include8、ream>usingnamespacestd;classB0//基类B0声明{public:/
8、ream>usingnamespacestd;classB0//基类B0声明{public:/
此文档下载收益归作者所有