欢迎来到天天文库
浏览记录
ID:44235529
大小:512.00 KB
页数:56页
时间:2019-10-19
《6 多态性与虚函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第6章多态性与虚函数6.1多态性概述6.2虚函数6.3纯虚函数和抽象类在OOP中:窗口对象行为3移动同一消息棋子对象行为46.1多态性概述多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时导致完全不同的行为。多态的实现:1函数重载2运算符重载3虚函数4类模板在C++中,多态的实现和联编这一概念有关。所谓联编就是把函数名与函数体的程序代码连接(联系)在一起的过程。静态联编联编动态联编静态联编就是在编译阶段完成的联编。静态联编函数调用速度很快。效率高,但缺乏灵活性;动
2、态联编是运行阶段完成的联编。动态联编在运行时才能确定调用哪个函数,它降低了程序的运行效率,但增强了程序的灵活性。C++实际上是采用了静态联编和动态联编相结合的联编方法。编译时的多态性多态性运行时的多态性编译时的多态是通过静态联编来实现的。运行时的多态是通过动态联编实现的。在C++中:编译时多态性主要是通过函数重载和运算符重载实现的。运行时多态性主要是通过虚函数来实现的。6.2虚函数6.2.1虚函数的引入6.2.2虚函数的作用和定义6.2.3虚析构函数6.2.4虚函数与重载函数的关系6.2.5多继承与
3、虚函数#includeclassbase{//例6.1-1虚函数引例inta,b;public:base(intx,inty){a=x;b=y;}voidshow(){cout<<"调用基类base的show函数";cout<<"a="<4、rive的show函数";cout<<"c="<show();mp=&mc;mp->show();}运行结果?6.2.1虚函数的引入#include//例6.1-1虚函数引例classbase{inta,b;public:base(intx,inty){a=x;b=y;}voidshow(){cout<<"调用基类base的show5、函数";cout<<"a="<show();mp=&mc;mp->s6、how();}程序运行结果不是:调用基类base的show函数a=50b=50调用派生类dirive的show函数c=30程序运行结果如下:调用基类base的show函数a=50b=50调用基类base的show函数a=10b=20为什么?在C++中规定:基类的对象指针可以指向它的公有派生的对象,但是当其指向公有派生类对象时,它只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员,例如:classA{public:voidprint1(){...}};classB:publicA{p7、ublic:voidprint2(){...}};voidmain(){A*p1;//定义基类A的指针变量p1Bop2;//定义派生类B的对象op2p1=&op2;//将指针变量p1指向派生类对象op2p1->print1();p1->print2();}正确,基类指针变量p1可以访问派生类中从基类继承来的成员函数print1()错误,基类指针变量p1不能访问派生类中定义的成员函数print2()#include//例6.1-1虚函数引例classbase{inta,b;pu8、blic:base(intx,inty){a=x;b=y;}voidshow(){cout<<"调用基类base的show函数";cout<<"a="<
4、rive的show函数";cout<<"c="<show();mp=&mc;mp->show();}运行结果?6.2.1虚函数的引入#include//例6.1-1虚函数引例classbase{inta,b;public:base(intx,inty){a=x;b=y;}voidshow(){cout<<"调用基类base的show
5、函数";cout<<"a="<show();mp=&mc;mp->s
6、how();}程序运行结果不是:调用基类base的show函数a=50b=50调用派生类dirive的show函数c=30程序运行结果如下:调用基类base的show函数a=50b=50调用基类base的show函数a=10b=20为什么?在C++中规定:基类的对象指针可以指向它的公有派生的对象,但是当其指向公有派生类对象时,它只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员,例如:classA{public:voidprint1(){...}};classB:publicA{p
7、ublic:voidprint2(){...}};voidmain(){A*p1;//定义基类A的指针变量p1Bop2;//定义派生类B的对象op2p1=&op2;//将指针变量p1指向派生类对象op2p1->print1();p1->print2();}正确,基类指针变量p1可以访问派生类中从基类继承来的成员函数print1()错误,基类指针变量p1不能访问派生类中定义的成员函数print2()#include//例6.1-1虚函数引例classbase{inta,b;pu
8、blic:base(intx,inty){a=x;b=y;}voidshow(){cout<<"调用基类base的show函数";cout<<"a="<
此文档下载收益归作者所有