
C面向对象实用例子章习题分析实用教案.ppt
34页•通过基类指针或引用即可访问(fǎngwèn)基类和派生类中的同名函数第1页/共33页第一页,共34页例2:这里(zhèlǐ)用到了什么?第2页/共33页第二页,共34页第3页/共33页第三页,共34页虚基类•上例用到了虚基类,虚继承•只存在一个(yīɡè)CAnimal的复制第4页/共33页第四页,共34页例3:这里(zhèlǐ)用到了什么?第5页/共33页第五页,共34页第6页/共33页第六页,共34页抽象类•上例用到了抽象类,纯虚函数•抽象类面积的计算方法不确定,设为纯虚函数,这样圆形有圆形的面积计算方法,矩形有矩形的面积计算方法,每个继承于CFigure的类都有自己的面积,通过getArea成员函数即可获得面积•包含纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数抽象类只能作为基类派生新的子类,不能实例化•比如,软件构造师可以通过纯虚函数建立接口,然后让程序员填写(tiánxiě)代码实现接口,而自己主要负责建立抽象类第7页/共33页第七页,共34页例4:实现(shíxiàn)抽象类中的成员函数第8页/共33页第八页,共34页第9页/共33页第九页,共34页。
例5:多重继承(jìchéng)•多个(duōɡè)基类派生一个子类第10页/共33页第十页,共34页•派生出Teacher_Level类,包含教师和职称(zhíchēng)信息,新增工资信息第11页/共33页第十一页,共34页练习1:写出下列(xiàliè)程序的运行结果#include
•程序运行结果( jiēguǒ):•x=5•y=8第14页/共33页第十四页,共34页练习(liànxí)2:•下列Shape类是一个表示形状的抽象类,area()为求图形面积的函数,total()则是一个通用的用以求不同形状的图形面积总和的函数请从Shape类派生三角形类(Triangle)、矩形类(Rectangle),并给出具体(jùtǐ)的求面积函数•classShape{•public:• virtualdoublearea()const=0;//纯虚函数•};•floattotal(Shape*s[],intn)//一般函数•{ floatsum=0.0;• for(inti=0;i
练习3:写出下列程序的运行(yùnxíng)结果•//Triangle.h•#include
//abc.cpp•#include"Triangle.h"•voidmain()•{•Trianglet1;•t1.SetTriangle(4,5,6);•Trianglet2;•t2.SetTriangle(7,8,9);•Triangle&max=compare(t1,t2);•max.Print();•}第19页/共33页第十九页,共34页//abc.cpp程序运行结果( jiēguǒ):thethreesideofthetriangleis:7,8,9theperimeterofthetriangleis:24theareaofthetriangleis:26.8328第20页/共33页第二十页,共34页练习5:写出下列(xiàliè)程序的运行结果•#include
•classD:publicB•{•public:•D(){}•D(inti,intj):B(i){d=j;}•voidvirfun()•{cout<<"D::virfum()iscalled.\n";}•private:•intd;•};•voidfun(B*obj)•{obj->virfun();}第22页/共33页第二十二页,共34页•intmain()•{•B*pd=newD;•fun(pd);•return0;•}第23页/共33页第二十三页,共34页运行(yùnxíng)结果:•intmain()•{•B*pd=newD;•fun(pd);•return0;•}•运行(yùnxíng)结果:D::virfum()iscalled.第24页/共33页第二十四页,共34页练习(liànxí)6•定义一个抽象类CShape,包含纯虚函数Area()(用于计算面积)和SetData()(用于重设形状大小)。
然后派生出三角形CTriangle类、矩形CRect类、圆CCircle类,分别求其面积最后定义一个CArea类,计算这几个形状的面积之和,各形状的数据通过CArea类构造函数或成员函数来设置编写一个完整(wánzhěng)的程序第25页/共33页第二十五页,共34页•#include
•classCRect:publicCShape•{•doubleh,w;•public:•CRect(){h=w=0.0;}•CRect(doubleH,doubleW){h=H;w=W;}•virtualdoubleArea(){returnh*w;}•virtualvoidSetData()•{cout<<"输入(shūrù)矩形的长和宽:\n";cin>>h>>w;}•};第28页/共33页第二十八页,共34页•classCCircle:publicCShape•{•doubler;•public:•CCircle(){r=0.0;}•CCircle(doubleR){r=R;}•virtualdoubleArea(){returnr*r*3.14;}•virtualvoidSetData()•{cout<<"输入(shūrù)圆形的半径:\n";•cin>>r;}•};第29页/共33页第二十九页,共34页。
•classCArea•{CShape*s[3];•public:•CArea(doubleTA=0.0,doubleTB=0.0,doubleTC=0.0,doubleRH=0.0,doubleRW=0.0,doubleCR=0.0)•{s[0]=newCTriangle(TA,TB,TC);•s[1]=newCRect(RH,RW);•s[2]=newCCircle(CR);}•~CArea()•{deletes[0];deletes[1];deletes[2];}•voidSetData()•{s[0]->SetData();s[1]->SetData();s[2]->SetData();}•doubleGetArea()•{returns[0]->Area()+s[1]->Area()+s[2]->Area();}•};第30页/共33页第三十页,共34页•intmain()•{•CAreaarea(3.0,4.0,5.0,3.0,5.0,3.0);•cout<<"图形(túxíng)面积之和:"<<area.GetArea()<<endl;•area.SetData();•cout<<"图形(túxíng)面积之和:"<<area.GetArea()<<endl;•return0;•}第31页/共33页第三十一页,共34页。
练习(liànxí)7:•定义一个表示三维空间坐标点的类,并对下列运算符重载(1)、<<:按(x,y,z)格式输出(shūchū)该点坐标(坐标为整型);(2)、>:如果A点到原点的距离大于B点到原点的距离,则A>B为真,否则为假第32页/共33页第三十二页,共34页感谢您的欣赏(xīnshǎng)!第33页/共33页第三十三页,共34页内容(nèiróng)总结通过(tōngguò)基类指针或引用即可访问基类和派生类中的同名函数通过(tōngguò)基类指针或引用即可访问基类和派生类中的同名函数上例用到了虚基类,虚继承例3: 这里用到了什么double area()const{return H*Wint a,b,cinclude "Triangle.h"t1.SetTriangle(4,5,6)t2.SetTriangle(7,8,9)第32页/共33页感谢您的欣赏第33页/共33页第三十四页,共34页。
