- 260.00 KB
- 42页
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
第8章多态性AB8.1运算符重载8.2运算符重载为类的成员函数8.3运算符重载为类的友元函数8.4虚函数
8.1运算符重载8.1.1问题的提出例6.3的复数类#include"iostream.h"classCComplex{private:doublereal;doubleimag;public:CComplex(doubler,doublei);voidPrint();CComplexAdd(CComplexc);CComplexSub(CComplexc);};第8章多态性CComplexCComplex::Add(CComplexc){CComplextemp;temp.real=real+c.real;temp.imag=imag+c.imag;returntemp;}CComplexCComplex::Sub(CComplexc){CComplextemp;temp.real=real-c.real;temp.imag=imag-c.imag;returntemp;}
8.1运算符重载8.1.1问题的提出(续一)voidmain(void){CComplexa(1,2),b(3.0,4.0),c,d;c=a.Add(b);d=a.Sub(b);cout<<"c=";c.Print();cout<<"d=";d.Print();}第8章多态性复数加减法只能调用成员函数实现,不能使用符号“+”和“-”,可以通过重载“+”、“-”运算符,实现如c=a+b这样的调用方式运算符重载:运算符重载的实质就是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,产生不同的行为。运算符重载的实质就是函数重载。
例8.1用运算符实现复数的加减运算#include"iostream.h"classCComplex{private:doublereal;doubleimag;public:CComplex(doubler=0,doublei=0);voidPrint();CComplexoperator+(CComplexc);CComplexoperator-(CComplexc);};CComplex::CComplex(doubler,doublei){real=r;imag=i;}第8章多态性
例8.1(续一)voidCComplex::Print(){cout<<"("<Draw();}第8章多态性程序运行结果为:DrawaShape.ThecolorisRedDrawaShape.ThecolorisGreenDrawaShape.ThecolorisRedBlack虽然父类的指针可以指向子类的对象,但调用的函数Draw()都是父类CShape的成员函数为了能通过基类的指针调用派生类的成员函数,可以使用虚函数的方法,即把成员函数Draw()声明为虚函数。
例8.7用虚函数实现动态多态#include#includeclassCPoint{private:intX;intY;public:CPoint(intx=0,inty=0){X=x;Y=y;}CPoint(CPoint&p){X=p.X;Y=p.Y;}intGetX(){returnX;}intGetY(){returnY;}};第8章多态性
例8.7(续一)classCShape{private:charColor[10];public:CShape(char*c){strcpy(Color,c);}virtualvoidDraw(){cout<<"DrawaShape.Thecoloris"<Draw();}第8章多态性程序运行结果为:DrawaShape.ThecolorisRedDrawaLinefrom(10,10)to(100,100),withcolorGreenDrawaCircleatcenter(50,50)withradius20andcolorBlack
8.4虚函数8.4.1用虚函数实现动态多态(续)总结:(1)将成员函数声明为虚函数,在函数原型前加关键字virtual,如果成员函数的定义直接写在类中,也在前面加关键字virtual。(2)将成员函数声明为虚函数后,再将基类指针指向派生类对象,在程序运行时,就会根据指针指向的具体对象来调用各自的虚函数,称之为动态多态。(3)如果基类的成员函数是虚函数,在其派生类中,原型相同的函数自动成为虚函数。第8章多态性
8.4虚函数8.4.2用虚函数实现动态多态的机制为了实现动态多态,编译器对每个包含虚函数的类创建一个虚函数地址表,并设置一个虚函数地址指针指向这个对象的虚函数地址表。使用基类指针对虚函数调用时,通过这个虚函数地址指针,在虚函数地址表中查找函数地址。由于包含虚函数的类,有一个虚函数地址指针,与没有虚函数的类相比,含有虚函数类的对象所占用的存储空间要多一个指针所占用的内存。第8章多态性
例8.8含有虚函数类的对象所占用的存储空间。#includeclassA{private:inta;public:virtualvoidfunc(){}};classB:publicA{private:intb;public:virtualvoidfunc(){}virtualvoidfunc1(){}};voidmain(void){cout<<"sizeof(A)="<#includeclassCEmployee{private:char*name;intage;public:CEmployee(char*n,inta);virtual~CEmployee();};CEmployee::CEmployee(char*n,inta){name=newchar[strlen(n)+1];strcpy(name,n);age=a;}第8章多态性
例8.9(续一)CEmployee::~CEmployee(){cout<<"DestructCEmployee"<