欢迎来到天天文库
浏览记录
ID:58727115
大小:410.00 KB
页数:56页
时间:2020-10-04
《多态性与虚函数ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第九章多态性与虚函数多态性(polymorphism):多态性是面向对象程序语言的一个重要特征。通过多态,实现同一界面,多种实现。若程序设计语言不支持多态性,不能称为面向对象的语言。C++还提供一种更为灵活的多态机制:虚函数(Virtualfunction)。虚函数允许函数调用与函数体的联系在运行时才进行。类、继承和多态,提供了软件重用性和扩展性需要的卓越表达能力。学习目标:1.理解多态性的概念、多态的类型;2.掌握用虚函数实现动态联编;3.理解静态多态性与动态多态性的区别与实现机制;4.掌握抽象类的概念、设计方法与应用。第九章多
2、态性与虚函数9.1多态性概述9.4抽象类实例9.3抽象类9.5程序实例9.2多态性与虚函数第九章多态性与虚函数9.1多态性概述多态是指同样的消息被不同类型的对象接收时导致不同的行为,所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。9.1.1多态的类型9.1.2多态的实现9.1多态性概述9.1.1多态的类型类型名称应用专用多态重载多态普通函数及类的成员函数的重载、运算符重载强制多态不同类型数据运算通用多态包含多态虚函数参数多态类模板9.1.2多态的实现多态从实现的角度来讲可以划分为两类:编译时的多
3、态和运行时的多态。多态类型完成时刻应用编译时的多态(静态联编)程序编译时刻确定同名操作对象运算符重载、函数模板实例化运行时的多态(动态联编)程序运行时刻确定同名操作对象虚函数9.2多态性与虚函数9.2.2虚函数9.2.3虚析构函数9.2.1静态联编9.2.1静态联编#includeusingnamespacestd;classPoint{public:Point(doublei,doublej){x=i;y=j;}doubleArea()const{return0.0;}private:doublex,y;};
4、classRectangle:publicPoint{public:Rectangle(doublei,doublej,doublek,doublel);doubleArea()const{returnw*h;}private:doublew,h;};静态联编实例9.2.1静态联编Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j){w=k;h=l;}voidfun(Point&s){cout<<"Area="<5、ain(){Rectanglerec(3.0,5.2,15.0,25.0);fun(rec);}运行结果:Area=0静态联编实例调用的是Point类的Area()9.2.2虚函数根据类型兼容规则,可以使用派生类的对象代替基类对象。如果用基类类型的指针指向派生类对象,就可以通过这个指针来访问该对象。问题是访问到的只是从基类继承来的同名成员。解决办法:如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员,那么首先在基类中将这个同名函数说明为虚函数。这样,通过基类类型的指针,就可以使属于不同派生类的不同对象产生不同的行为6、,从而实现了运行过程的多态。#includeusingnamespacestd;classPoint{public:Point(doublei,doublej){x=i;y=j;}virtualdoubleArea()const{return0.0;}private:doublex,y;};classRectangle:publicPoint{public:Rectangle(doublei,doublej,doublek,doublel);virtualdoubleArea()const{returnw*h;7、}private:doublew,h;};动态联编实例voidfun(Point&s){cout<<"Area="<8、)。否则被认为是重载,而不是虚函数。2.只有类的成员函数才能说明为虚函数。这是因为虚函数仅适用于有继承关系的类对象。3.静态成员函数,是所有同一类对象共有,不受限于某个对象,不能作为虚函数。4.实现动态多态性时,必须使用基类类型的指针变量或引用,使
5、ain(){Rectanglerec(3.0,5.2,15.0,25.0);fun(rec);}运行结果:Area=0静态联编实例调用的是Point类的Area()9.2.2虚函数根据类型兼容规则,可以使用派生类的对象代替基类对象。如果用基类类型的指针指向派生类对象,就可以通过这个指针来访问该对象。问题是访问到的只是从基类继承来的同名成员。解决办法:如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员,那么首先在基类中将这个同名函数说明为虚函数。这样,通过基类类型的指针,就可以使属于不同派生类的不同对象产生不同的行为
6、,从而实现了运行过程的多态。#includeusingnamespacestd;classPoint{public:Point(doublei,doublej){x=i;y=j;}virtualdoubleArea()const{return0.0;}private:doublex,y;};classRectangle:publicPoint{public:Rectangle(doublei,doublej,doublek,doublel);virtualdoubleArea()const{returnw*h;
7、}private:doublew,h;};动态联编实例voidfun(Point&s){cout<<"Area="<8、)。否则被认为是重载,而不是虚函数。2.只有类的成员函数才能说明为虚函数。这是因为虚函数仅适用于有继承关系的类对象。3.静态成员函数,是所有同一类对象共有,不受限于某个对象,不能作为虚函数。4.实现动态多态性时,必须使用基类类型的指针变量或引用,使
8、)。否则被认为是重载,而不是虚函数。2.只有类的成员函数才能说明为虚函数。这是因为虚函数仅适用于有继承关系的类对象。3.静态成员函数,是所有同一类对象共有,不受限于某个对象,不能作为虚函数。4.实现动态多态性时,必须使用基类类型的指针变量或引用,使
此文档下载收益归作者所有