ImageVerifierCode 换一换
格式:PPT , 页数:56 ,大小:474.50KB ,
文档编号:5100560      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-5100560.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(晟晟文业)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(c++教学讲解课件第8章.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

c++教学讲解课件第8章.ppt

1、1第八章第八章 多态性多态性清华大学清华大学 郑郑 莉莉C+语言程序设计C+语言程序设计清华大学 郑莉2本章主要内容本章主要内容l多态性多态性l运算符重载运算符重载l虚函数虚函数l纯虚函数纯虚函数l抽象类抽象类l深度探索深度探索C+语言程序设计清华大学 郑莉3多态性的概念多态性的概念l多态性是面向对象程序设计的重要特多态性是面向对象程序设计的重要特征之一。征之一。l多态性是指发出同样的消息被不同类多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同型的对象接收时有可能导致完全不同的行为。的行为。l多态的实现:多态的实现:函数重载 运算符重载 虚函数C+语言程序设计清华大学 郑莉4问

2、题举例问题举例复数的运算复数的运算class Complex class Complex /复数类声明复数类声明public:public:Complex(double r=0.0,double Complex(double r=0.0,double i i=0.0)=0.0)real=r;real=r;imagimag=i i;void display()const;void display()const;/显示复数的值显示复数的值private:private:double real;double real;double double imagimag;运算符重载C+语言程序设计清华大学

3、郑莉5问题举例问题举例复数的运算复数的运算l用用“+”、“-”能够实现复数的加减运能够实现复数的加减运算吗?算吗?l实现复数加减运算的方法实现复数加减运算的方法 重载重载“+”、“-”运算符运算符运算符重载C+语言程序设计清华大学 郑莉6运算符重载的实质运算符重载的实质l运算符重载是对已有的运算符赋予多重含运算符重载是对已有的运算符赋予多重含义义l必要性必要性 C+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)l实现机制实现机制 将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。运算符

4、重载C+语言程序设计清华大学 郑莉规则和限制规则和限制lC+中能够被重载的运算符有:中能够被重载的运算符有:new delete new delete+-*/%&|!=+=-=*=/=%=&=|=!=&|+-,-*-()7运算符重载C+语言程序设计清华大学 郑莉8运算符重载规则和限制(续)规则和限制(续)l只能重载只能重载C+语言中已有的运算符,语言中已有的运算符,不可臆造新的。不可臆造新的。l不改变原运算符的优先级和结合性。不改变原运算符的优先级和结合性。l不能改变操作数个数。不能改变操作数个数。l经重载的运算符,其操作数中至少应经重载的运算符,其操作数中至少应该有一个是自定义类型。该有一个

5、是自定义类型。C+语言程序设计清华大学 郑莉9两种形式两种形式l重载为类的非静态成员函数重载为类的非静态成员函数l重载为非成员函数重载为非成员函数运算符重载C+语言程序设计清华大学 郑莉10运算符函数运算符函数l声明形式声明形式函数类型 operator 运算符(形参).l重载为类成员函数时重载为类成员函数时 参数个数参数个数=原操作数个数原操作数个数-1(后置(后置+、-除外)除外)l重载为非成员函数时重载为非成员函数时 参数个数参数个数=原操作数个数原操作数个数,且至少应该有一个自定义类型的形参。且至少应该有一个自定义类型的形参。运算符重载C+语言程序设计清华大学 郑莉11运算符成员函数的

6、设计运算符成员函数的设计l双目运算符双目运算符 B 如果要重载 B 为类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的成员函数,形参类型应该是 oprd2 所属的类型。经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)运算符重载C+语言程序设计清华大学 郑莉12运算符重载 例例 8-1 将将“+”+”、“-”-”运算重载为复数类运算重载为复数类的成员函数。的成员函数。l 规则规则:实部和虚部分别相加减。实部和虚部分别相加减。l 操作数操作数:两个操作数都是复数类的对象。两个

7、操作数都是复数类的对象。#include#include using namespace std;using namespace std;class Complex class Complex /复数类定义复数类定义public:public:/外部接口外部接口Complex(double r=0.0,double Complex(double r=0.0,double i i=0.0):=0.0):real(r),real(r),imagimag(i i)/构造函数构造函数Complex operator+(const Complex&c2)const;Complex operator+(c

8、onst Complex&c2)const;/运算符运算符+重载成员函数重载成员函数Complex operator-(const Complex&c2)const;Complex operator-(const Complex&c2)const;/运算符运算符-重载成员函数重载成员函数void display()const;void display()const;/输出复数输出复数private:private:/私有数据成员私有数据成员double real;double real;/复数实部复数实部double double imagimag;/复数虚部复数虚部;13Complex Co

9、mplex ComplexComplex:operator+(const Complex:operator+(const Complex&c2)&c2)const const/重载运算符函数实现重载运算符函数实现return return Complex(real+c2.real,Complex(real+c2.real,imagimag+c2.imag)c2.imag);/;/创建一个临时无名对象作为返回值创建一个临时无名对象作为返回值 Complex Complex ComplexComplex:operator-(const Complex:operator-(const Complex

10、&c2)const&c2)const/重载运算符函数实现重载运算符函数实现return return Complex(real-c2.real,Complex(real-c2.real,imagimag-c2.imag)c2.imag);/;/创建一个临时无名对象作为返回值创建一个临时无名对象作为返回值 14void Complex:display()const void Complex:display()const cout (real ,imag )cout (real ,imag )endl;endl;int main()int main()/主函数主函数Complex c1(5,4),

11、c2(2,10),c3Complex c1(5,4),c2(2,10),c3;/;/定义复数类的对象定义复数类的对象cout c1=;c1.display();cout c1=;c1.display();cout c2=;c2.display();cout c2=;c2.display();c3=c3=c1-c2c1-c2;/使用重载运算符完成复数减法使用重载运算符完成复数减法cout c3=c1-c2=;c3.display();cout c3=c1-c2=;c3.display();c3=c3=c1+c2c1+c2;/使用重载运算符完成复数加法使用重载运算符完成复数加法cout c3=c1

12、+c2=;c3.display();cout c3=c1+c2=;c3.display();return 0;return 0;15程序输出的结果为:程序输出的结果为:c1=(5,4)c2=(2,10)c3=c1-c2=(3,-6)c3=c1+c2=(7,14)16C+语言程序设计清华大学 郑莉17运算符成员函数的设计运算符成员函数的设计l前置单目运算符前置单目运算符 U 如果要重载 U 为类成员函数,使之能够实现表达式 U oprd,其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数,无形参。经重载后,表达式 U oprd 相当于 oprd.operator U()运算符重载C

13、+语言程序设计清华大学 郑莉18运算符成员函数的设计运算符成员函数的设计l后置单目运算符后置单目运算符+和和-如果要重载+或-为类成员函数,使之能够实现表达式 oprd+或 oprd-,其中 oprd 为A类对象,则+或-应被重载为 A 类的成员函数,且具有一个 int 类型形参。经重载后,表达式 oprd+相当于 oprd.operator+(0)运算符重载C+语言程序设计清华大学 郑莉19例例8-2l运算符前置运算符前置+和后置和后置+重载为时钟类重载为时钟类的成员函数。的成员函数。l前置单目运算符,重载函数没有形参,前置单目运算符,重载函数没有形参,对于后置单目运算符,重载函数需要对于后

14、置单目运算符,重载函数需要有一个整型形参。有一个整型形参。l操作数是时钟类的对象。操作数是时钟类的对象。l实现时间增加实现时间增加1秒钟。秒钟。运算符重载#include#include using namespace std;using namespace std;class Clock class Clock/时钟类声明定义时钟类声明定义public:public:/外部接口外部接口Clock(int hour=0,int minute=0,int Clock(int hour=0,int minute=0,int second=0);second=0);void showTime()co

15、nst;void showTime()const;Clock&operator+();Clock&operator+();/前置单目运算符重载前置单目运算符重载Clock operator+(int);Clock operator+(int);/后置单目运算符重载后置单目运算符重载private:private:/私有数据成员私有数据成员int hour,minute,second;int hour,minute,second;20/前置单目运算符重载函数前置单目运算符重载函数Clock&Clock:operator+()Clock&Clock:operator+()second+;secon

16、d+;if(second=60)if(second=60)second-=60;second-=60;minute+;minute+;if(minute=60)if(minute=60)minute-=60;minute-=60;hour=(hour+1)%24;hour=(hour+1)%24;return return*this;this;21/后置单目运算符重载后置单目运算符重载Clock Clock ClockClock:operator+(:operator+(intint)/注意形参表中的整型参数注意形参表中的整型参数Clock old=Clock old=*this;this;+

17、(+(*this);this);/调用前置调用前置“+”+”运算符运算符return old;return old;22/其它成员函数的实现略其它成员函数的实现略intint main()main()Clock Clock myClockmyClock(23,59,59);(23,59,59);coutcout First time output:;First time output:;myClock.showTimemyClock.showTime();();coutcout Show Show myClockmyClock+:;+:;(myClockmyClock+).).showTime

18、showTime();();coutcout Show+Show+myClockmyClock:;:;(+myClockmyClock).).showTimeshowTime();();return 0;return 0;23程序运行结果为:程序运行结果为:First time output:23:59:59First time output:23:59:59Show Show myClockmyClock+:23:59:59+:23:59:59Show+Show+myClockmyClock:0:0:1:0:0:124C+语言程序设计清华大学 郑莉25运算符非成员函数的设计运算符非成员函数的

19、设计l函数的形参代表依自左至右次序排列函数的形参代表依自左至右次序排列的各操作数。的各操作数。l后置单目运算符后置单目运算符+和和-的重载函数,的重载函数,形参列表中要增加一个形参列表中要增加一个int,但不必写,但不必写形参名。形参名。l如果在运算符的重载函数中需要操作如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数某类对象的私有成员,可以将此函数声明为该类的友元。声明为该类的友元。运算符重载C+语言程序设计清华大学 郑莉26运算符非成员函数的设计运算符非成员函数的设计l双目运算符双目运算符 B重载后,重载后,表达式表达式oprd1 B oprd2 等同于等同于operato

20、r B(oprd1,oprd2)l前置单目运算符前置单目运算符 B重载后,重载后,表达式表达式 B oprd 等同于等同于operator B(oprd)l后置单目运算符后置单目运算符+和和-重载后,重载后,表达式表达式 oprd B 等同于等同于operator B(oprd,0)运算符重载C+语言程序设计清华大学 郑莉27例例8-3l将将+、-(双目)重载为非成员函数,(双目)重载为非成员函数,并将其声明为并将其声明为复数类的友元,两个操作数都是复数类的常引用。复数类的友元,两个操作数都是复数类的常引用。l将将(双目)重载为非成员函数,并将其声明为(双目)重载为非成员函数,并将其声明为复数

21、类的友元,它的左操作数是复数类的友元,它的左操作数是std:ostream引用,引用,右操作数为复数类的常引用,返回右操作数为复数类的常引用,返回std:ostream引引用,用以支持下面形式的输出:用,用以支持下面形式的输出:coutcout a a b;b;该输出调用的是:该输出调用的是:operator operator (operator (operator (coutcout,a),b);,a),b);运算符重载#include#include using namespace std;using namespace std;class Complex class Complex /复

22、数类定义复数类定义public:public:/外部接口外部接口Complex(double r=0.0,double Complex(double r=0.0,double i i=0.0):real(r),=0.0):real(r),imagimag(i i)/构造函数构造函数friend Complex operator+(const Complex&c1,friend Complex operator+(const Complex&c1,const Complex&c2);const Complex&c2);/运算符运算符+重载重载friend Complex operator-(co

23、nst Complex&c1,friend Complex operator-(const Complex&c1,const Complex&c2);const Complex&c2);/运算符运算符-重载重载friend friend ostreamostream&operator (&operator (ostreamostream&out,const&out,const Complex&c);Complex&c);/运算符运算符重载重载private:private:/私有数据成员私有数据成员double real;double real;/复数实部复数实部double double i

24、magimag;/复数虚部复数虚部;28Complex Complex operator+operator+(const Complex&c1,const Complex&c2)(const Complex&c1,const Complex&c2)return Complex(c1.real+c2.real,c1.imag+c2.imag);return Complex(c1.real+c2.real,c1.imag+c2.imag);Complex Complex operator-operator-(const Complex&c1,const Complex&c2)(const Comp

25、lex&c1,const Complex&c2)return Complex(c1.real-c2.real,c1.imag-c2.imag);return Complex(c1.real-c2.real,c1.imag-c2.imag);ostreamostream&operator operator (ostreamostream&out,const Complex&c)&out,const Complex&c)out (out (c.realc.real ,c.imagc.imag ););return out;return out;29C+语言程序设计清华大学 郑莉30静态绑定与动态绑

26、定静态绑定与动态绑定l绑定绑定 程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。l静态绑定静态绑定 绑定过程出现在编译阶段,用对象名或者类名来限定要调用的函数。l动态绑定动态绑定 绑定工作在程序运行时执行,在程序运行时才确定将要调用的函数。#include#include using namespace std;using namespace std;class class Point Point public:public:Point(double x,double y):x(x),y(y)Point(double x,double y):x(x),y(y)doubl

27、edouble area area()const return 0.0;()const return 0.0;private:private:double x,y;double x,y;class class RectangleRectangle:public:public Point Point public:public:Rectangle(double x,double y,double w,double h);Rectangle(double x,double y,double w,double h);double double areaarea()const return w()co

28、nst return w*h;h;private:private:double w,h;double w,h;静态绑定例31Rectangle:Rectangle(double x,double y,double w,Rectangle:Rectangle(double x,double y,double w,double h):double h):PointPoint(x,y),w(w),h(h)(x,y),w(w),h(h)void fun(const void fun(const Point&sPoint&s)coutcout Area=Area=s s.area.area()()end

29、lendl;intint main()main()Rectangle Rectangle recrec(3.0,5.2,15.0,25.0);(3.0,5.2,15.0,25.0);fun(fun(recrec););return 0;return 0;运行结果:运行结果:Area=0Area=032#include#include using namespace std;using namespace std;class Point class Point public:public:Point(double x,double y):x(x),y(y)Point(double x,doubl

30、e y):x(x),y(y)virtualvirtual double area()const return 0.0;double area()const return 0.0;private:private:double x,y;double x,y;class class Rectangle:publicRectangle:public Point Point public:public:Rectangle(double x,double y,double w,double h);Rectangle(double x,double y,double w,double h);virtualv

31、irtual double area()const return w double area()const return w*h;h;private:private:double w,h;double w,h;/其他函数同上例其他函数同上例动态绑定例 33void fun(const void fun(const Point&sPoint&s)coutcout Area=Area=s s.area.area()()endlendl;intint main()main()Rectangle Rectangle recrec(3.0,5.2,15.0,25.0);(3.0,5.2,15.0,25.

32、0);fun(fun(recrec););return 0;return 0;运行结果:运行结果:Area=375Area=37534C+语言程序设计清华大学 郑莉35虚函数虚函数l虚函数是动态绑定的基础。虚函数是动态绑定的基础。l是非静态的成员函数。是非静态的成员函数。l在类的声明中,在函数原型之前写在类的声明中,在函数原型之前写virtual。lvirtual 只用来说明类声明中的原型,不能用在只用来说明类声明中的原型,不能用在函数实现时。函数实现时。l具有继承性,基类中声明了虚函数,派生类中具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。无论是否说明,同原

33、型函数都自动为虚函数。l本质:不是重载声明而是覆盖。本质:不是重载声明而是覆盖。l调用方式:通过基类指针或引用,执行时会调用方式:通过基类指针或引用,执行时会根据根据指针指向的对象的类指针指向的对象的类,决定调用哪个函数。,决定调用哪个函数。虚 函 数C+语言程序设计清华大学 郑莉36例例 8-4#include#include using namespace std;using namespace std;class Base1 /class Base1 /基类基类Base1Base1定义定义public:public:virtualvirtual void void displaydisp

34、lay()const;()const;/虚函数虚函数;void Base1:display()const void Base1:display()const coutcout Base1:display()Base1:display()endlendl;class Base2:public Base1 /class Base2:public Base1 /公有派生类公有派生类Base2Base2定义定义public:public:void void displaydisplay()const;()const;/覆盖基类的虚函数覆盖基类的虚函数;void Base2:display()const

35、 void Base2:display()const coutcout Base2:display()Base2:display()endlendl;虚 函 数/公有派生类公有派生类DerivedDerived定义定义class Derived:public Base2 class Derived:public Base2 public:public:void void displaydisplay()const;/()const;/覆盖基类的虚函数覆盖基类的虚函数;void Derived:display()const void Derived:display()const coutcout

36、 Derived:display()Derived:display()display();-display();/对象指针对象指针-成员名成员名 37intint main()main()/主函数主函数Base1 Base1 base1base1;/定义定义Base1Base1类对象类对象Base2 Base2 base2base2;/定义定义Base2Base2类对象类对象Derived Derived derivedderived;/定义定义DerivedDerived类对象类对象fun(&base1);fun(&base1);/用用Base1Base1对象的指针调用对象的指针调用funf

37、un函数函数fun(&base2);fun(&base2);/用用Base2Base2对象的指针调用对象的指针调用funfun函数函数fun(&derived);fun(&derived);/用用DerivedDerived对象的指针调用对象的指针调用funfun函数函数return 0;return 0;运行结果:运行结果:Base1:display()Base2:display()Derived:display()38C+语言程序设计清华大学 郑莉39虚析构函数虚析构函数为什么需要虚析构函数?为什么需要虚析构函数?l可能通过基类指针删除派生类对象;可能通过基类指针删除派生类对象;l如果你打

38、算允许其他人通过基类指针如果你打算允许其他人通过基类指针调用对象的析构函数(通过调用对象的析构函数(通过delete这这样做是正常的),就需要让基类的析样做是正常的),就需要让基类的析构函数成为虚函数,否则执行构函数成为虚函数,否则执行delete的结果是不确定的。的结果是不确定的。虚 函 数C+语言程序设计清华大学 郑莉40抽象类抽象类带有纯虚函数的类称为抽象类带有纯虚函数的类称为抽象类:class 类名类名 virtual 类型 函数名(参数表)=0;/纯虚函数纯虚函数 .纯虚函数与抽象类C+语言程序设计清华大学 郑莉41抽象类抽象类纯虚函数与抽象类l作用作用 抽象类为抽象和设计的目的而声

39、明,将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为。对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。l注意注意 抽象类只能作为基类来使用。不能声明抽象类的对象。构造函数不能是虚函数,析构函数可以是虚函数。C+语言程序设计清华大学 郑莉42例例 8-5纯虚函数与抽象类#include#include using namespace std;using namespace std;class Base1 /class Base1 /基类基类Base1Base1定义定义public:public:virtual void display()const=virtua

40、l void display()const=0 0;/纯虚函数纯虚函数;class Base2:public Base1 /class Base2:public Base1 /公有派生类公有派生类Base2Base2定义定义public:public:void void displaydisplay()const /()const /覆盖基类的虚函数覆盖基类的虚函数coutcout Base2:display()Base2:display()endlendl;class Derived:public Base2 /class Derived:public Base2 /公有派生类公有派生类De

41、rivedDerived定义定义public:public:void void displaydisplay()const /()const /覆盖基类的虚函数覆盖基类的虚函数coutcout Derived:display()Derived:display()display();-display();/对象指针对象指针-成员名成员名 intint main()main()/主函数主函数Base2 Base2 base2base2;/定义定义Base2Base2类对象类对象Derived Derived derivedderived;/定义定义DerivedDerived类对象类对象fun(&

42、base2);fun(&base2);/用用Base2Base2对象的指针调用对象的指针调用funfun函数函数fun(&fun(&derived);derived);/用用DerivedDerived对象的指针调用对象的指针调用funfun函数函数return 0;return 0;运行结果:运行结果:Base2:display()Derived:display()43C+语言程序设计清华大学 郑莉深度探索深度探索l多态类型与非多态类型多态类型与非多态类型l运行时类型识别运行时类型识别l虚函数动态绑定的实现原理虚函数动态绑定的实现原理44C+语言程序设计清华大学 郑莉多态类型与非多态类型多态

43、类型与非多态类型l多态类型与非多态类型多态类型与非多态类型 有虚函数的类类型称为多态类型 其它类型皆为非多态类型l二者的差异二者的差异 语言层面的差异l多态类型支持运行时类型识别l多态类型对象占用额外的空间 设计原则上的差异45深 度 探 索C+语言程序设计清华大学 郑莉设计原则设计原则l多态类型多态类型 多态类型的析构函数一般应为虚函数l非多态类型非多态类型 非多态类型不宜作为公共基类l由于没有利用动态多态性,一般可以用组合,而无需用共有继承;l如果继承,则由于析构函数不是虚函数,删除对象时所执行操作与指针类型有关,易引起混乱。把不需被继承的类型设定为非多态类型l由于成员函数都是静态绑定,调

44、用速度较快;l对象占用空间较小。46深 度 探 索C+语言程序设计清华大学 郑莉运行时类型识别运行时类型识别l运行时类型识别运行时类型识别 允许在运行时通过基类指针(或引用)辨别对象所属的具体派生类;只对多态类型适用;比虚函数动态绑定的开销更大,因此应仅对虚函数无法解决的问题使用。l运行时类型识别的方式运行时类型识别的方式 用dynamic_cast做类型转换的尝试;用typeid直接获取类型信息。47深 度 探 索C+语言程序设计清华大学 郑莉dynamic_cast的使用的使用l语法形式语法形式 dynamic_cast(表达式)l功能功能 将基类指针转换为派生类指针,将基类引用转换为派生

45、类引用;转换是有条件的l如果指针(或引用)所指对象的实际类型与转换的目的类型兼容,则转换成功进行;l否则如执行的是指针类型的转换,则得到空指针;如执行的是引用类型的转换,则抛出异常。48深 度 探 索C+语言程序设计清华大学 郑莉例例8-9 dynamic_cast示例示例#include#include using namespace std;using namespace std;class Base class Base public:public:virtual void fun1()virtual void fun1()coutcout Base:fun1()Base:fun1()e

46、ndlendl;virtual Base()virtual Base();class Derived1:class Derived1:public Base public Base public:public:virtual void fun1()virtual void fun1()coutcout Derived1:fun1()Derived1:fun1()endlendl;virtual void fun2()virtual void fun2()coutcout Derived1:fun2()Derived1:fun2()endlendl;class Derived2:class De

47、rived2:public Derived1public Derived1 public:public:virtual void fun1()virtual void fun1()coutcout Derived2:fun1()Derived2:fun1()endlendl;virtual void fun2()virtual void fun2()coutcout Derived2:fun2()Derived2:fun2()fun1();b-fun1();/尝试将尝试将b b转换为转换为Derived1Derived1指针指针Derived1 Derived1*d=d=dynamic_cas

48、tdynamic_castDerived1(b)(b);/判断转换是否成功判断转换是否成功if(d!=0)d-fun2();if(d!=0)d-fun2();intint main()main()Base b;Base b;fun(&b);fun(&b);Derived1 d1;Derived1 d1;fun(&d1);fun(&d1);Derived2 d2;Derived2 d2;fun(&d2);fun(&d2);return 0;return 0;运行结果:运行结果:Base:fun1()Derived1:fun1()Derived1:fun2()Derived2:fun1()Deri

49、ved2:fun2()50C+语言程序设计清华大学 郑莉typeid的使用的使用l语法形式语法形式 typeid(表达式)typeid(类型说明符)l功能功能 获得表达式或类型说明符的类型信息l表达式有多态类型时,会被求值,并得到动态类型信息;l否则,表达式不被求值,只能得到静态的类型信息。类型信息用type_info对象表示ltype_info是typeinfo头文件中声明的类;ltypeid的结果是type_info类型的常引用;l可以用type_info的重载的“=”、“!=”操作符比较两类型的异同;ltype_info的name成员函数返回类型名称,类型为const char*。51深

50、 度 探 索C+语言程序设计清华大学 郑莉例例8-10 typeid示例示例#include#include#include#include using namespace std;using namespace std;class Base class Base public:public:virtual Base()virtual Base();class Derived:public Base ;class Derived:public Base ;52深 度 探 索void fun(Base void fun(Base*b)b)/得到表示得到表示b b和和*b b类型信息的对象类型信息

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|