多态参考代码分析.docx
- 文档编号:24695047
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:20
- 大小:17.50KB
多态参考代码分析.docx
《多态参考代码分析.docx》由会员分享,可在线阅读,更多相关《多态参考代码分析.docx(20页珍藏版)》请在冰豆网上搜索。
多态参考代码分析
1224:
多态-虚函数问题
Description
请以点类Point为基类派生出一个圆类Circle。
Point类的数据成员为x、y(私有属性,存储点的横纵坐标),成员函数有构造函数Point(实现对数据成员x、y的初始化)、输出函数Display(输出点坐标);圆类Circle的数据成员为r(私有属性,存储圆的半径,圆心的点坐标通过继承点类Point加以实现),成员函数有构造函数Circle、计算圆的面积函数Area、计算圆的周长函数Perimeter和输出函数Display,其中构造函数实现基类和圆类的数据成员的初始化,Display函数实现圆心坐标、圆的半径、圆的面积(利用Area函数实现)和圆的周长(利用Perimeter函数实现)的输出。
实现Point类和Circle类的定义及成员函数。
主函数的代码(不允许改动)如下:
intmain()
{
doublex,y,r;
cin>>x>>y>>r;//圆心的点坐标及圆的半径
Point*p;
p=newPoint(x,y);
p->Display();
p=newCircle(x,y,r);
p->Display();
return0;
}
说明:
圆周率PI的取值为3.14
提示:
Display应设计为虚函数
Input
Output
SampleInput
001
SampleOutput
Point(0,0)
Circle'scenter:
Point(0,0)
Radius:
1
Area:
3.14
Perimeter:
6.28
****************************************************************
#include
usingnamespacestd;
constdoublePI=3.14;
classPoint
{
private:
doublex,y;
public:
Point(doublex1,doubley1);
virtualvoidDisplay();//虚函数
};
Point:
:
Point(doublex1,doubley1)
{x=x1;y=y1;}
voidPoint:
:
Display()
{cout<<"Point("< classCircle: publicPoint { private: doubler; public: Circle(doublex1,doubley1,doubler1); voidDisplay(); doubleArea(); doublePerimeter(); }; doubleCircle: : Area() {returnPI*r*r;} doubleCircle: : Perimeter() {return2*PI*r;} Circle: : Circle(doublex1,doubley1,doubler1): Point(x1,y1) {r=r1;} voidCircle: : Display() { cout<<"Circle'scenter: "; Point: : Display();//excutePoint: : Displayofbaseclass cout<<"Radius: "< cout<<"Area: "< cout<<"Perimeter: "< } intmain() { doublex,y,r; cin>>x>>y>>r;//圆心的点坐标及圆的半径 Point*p; p=newPoint(x,y); p->Display(); p=newCircle(x,y,r); p->Display(); return0; } 1229: 多态-抽象类1 Description 定义一个抽象类Shape,应用抽象类Shape派生圆类circle、圆的内接正方形类In_Square和圆的外切正方形类Ex_Square。 main中利用指向抽象类的指针实现求圆、圆的内接正方形和圆的外切正方形的面积和周长。 请实现各个类的成员函数,已知各类的定义及main中的代码如下(不允许修改): classShape { public: Shape(); virtualdoubleArea()=0; virtualdoublePerimeter()=0; }; classCircle: publicShape { public: Circle(doublerr); doubleRadius(); doubleArea(); doublePerimeter(); private: doubler;//圆的半径 }; classIn_Square: publicCircle { public: In_Square(doublerr); doubleArea(); doublePerimeter(); }; classEx_Square: publicCircle { public: Ex_Square(doublex); doubleArea(); doublePerimeter(); }; intmain() { Shape*ptr; doubler; cin>>r; ptr=newCircle(r); cout<<"Circle'sarea: "< cout<<"Circle'sperimeter: "< ptr=newIn_Square(r); cout<<"In_Square'sarea: "< cout<<"In_Square'sperimeter: "< ptr=newEx_Square(r); cout<<"Ex_Square'sarea: "< cout<<"Ex_Square'sperimeter: "< return0; } 圆周率PI值取3.14。 Input Output SampleInput 1.5 SampleOutput Circle'sarea: 7.065 Circle'sperimeter: 9.42 In_Square'sarea: 4.5 In_Square'sperimeter: 8.48528 Ex_Square'sarea: 9 Ex_Square'sperimeter: 12 #include #include usingnamespacestd; constdoublePI=3.14; classShape { public: Shape(); virtualdoubleArea()=0; virtualdoublePerimeter()=0; }; Shape: : Shape(){} classCircle: publicShape { public: Circle(doublerr); doubleRadius(); doubleArea(); doublePerimeter(); private: doubler;//圆的半径 }; Circle: : Circle(doubler1) {r=r1;} doubleCircle: : Radius() {returnr;} doubleCircle: : Area() {returnPI*r*r;} doubleCircle: : Perimeter() {return2*PI*r;} classIn_Square: publicCircle { public: In_Square(doublerr); doubleArea(); doublePerimeter(); }; In_Square: : In_Square(doubler): Circle(r){} doubleIn_Square: : Area() {doubler=Radius(); return2*r*r; } doubleIn_Square: : Perimeter() {doubler=Radius(); return4*sqrt (2)*r; } classEx_Square: publicCircle { public: Ex_Square(doublex); doubleArea(); doublePerimeter(); }; Ex_Square: : Ex_Square(doubler): Circle(r) {} doubleEx_Square: : Area() {doubler=Radius(); return4*r*r; } doubleEx_Square: : Perimeter() {doubler=Radius(); return8*r; } intmain() { Shape*ptr; doubler; cin>>r; ptr=newCircle(r); cout<<"Circle'sarea: "< cout<<"Circle'sperimeter: "< ptr=newIn_Square(r); cout<<"In_Square'sarea: "< cout<<"In_Square'sperimeter: "< ptr=newEx_Square(r); cout<<"Ex_Square'sarea: "< cout<<"Ex_Square'sperimeter: "< return0; } 1237: 多态-抽象类2 Description 定义一个抽象类Shape,应用抽象类Shape派生圆类Circle和长方形类Rectangle。 请完成各个类的定义及成员函数实现。 已知Shape类的定义及main中的代码如下(不允许修改): classShape { public: Shape(); virtualdoubleArea()=0; virtualdoublePerimeter()=0; }; intmain() { doubler,a,b; char*s[2]={"Circle: \n","Rectangle: \n"}; cin>>r>>a>>b; Shape*ptr[]={newCircle(r),newRectangle(a,b)}; for(inti=0;i<2;i++) { cout< cout<<"Area: "< cout<<"Perimeter: "< } return0; } Input Output SampleInput 123 SampleOutput Circle: Area: 3.14 Perimeter: 6.28 Rectangle: Area: 6 Perimeter: 10 ********************************************************************* #include usingnamespacestd; constdoublePI=3.14; classShape//抽象类,不实现具体任务,利用指向该类的指针可以实现多态访问子类各个函数 { public: Shape();//可以去掉 virtualdoubleArea()=0;//纯虚函数 virtualdoublePerimeter()=0;//纯虚函数 }; Shape: : Shape()//抽象类的构造不做任何任务,可以不定义 { } classCircle: publicShape { private: doubler; public: Circle(doubler1=0); doubleArea(); doublePerimeter(); }; Circle: : Circle(doubler1): r(r1) { //r=r1; } doubleCircle: : Area() { returnPI*r*r; } doubleCircle: : Perimeter() { return2*PI*r; } classRectangle: publicShape { private: doublea,b; public: Rectangle(doublea1=0,doubleb1=0); doubleArea(); doublePerimeter(); }; Rectangle: : Rectangle(doublea1,doubleb1) { a=a1; b=b1; } doubleRectangle: : Area() { returna*b; } doubleRectangle: : Perimeter() { return2*(a+b); } intmain() { doubler,a,b; char*s[2]={"Circle: \n","Rectangle: \n"}; cin>>r>>a>>b; Shape*ptr[]={newCircle(r),newRectangle(a,b)}; for(inti=0;i<2;i++) { cout< cout<<"Area: "< cout<<"Perimeter: "< } return0; } 1238: 多态-运算符重载1 Description 实现复数的<<,>>,+,-的运算符重载 已知Complex类的定义(不允许添加)及main中的代码(不允许改动)如下: classComplex { public: Complex(doubler=0,doublei=0); Complexoperator+(constComplex&c); Complexoperator-(constComplex&c); friendostream&operator<<(ostream&os,Complex&com); friendistream&operator>>(istream&is,Complex&com); voidDisplay(); private: doublereal; doubleimag; }; intmain() { Complexc1,c2,c3; cin>>c1>>c2; cout<<"("< c3=c1+c2; cout< cout<<"("< c3=c1-c2; cout< return0; } Input Output SampleInput 326-3 SampleOutput (3+2i)+(6-3i)=9-1i (3+2i)-(6-3i)=-3+5i #include usingnamespacestd; classComplex { public: Complex(doubler=0,doublei=0); Complexoperator+(constComplex&c); Complexoperator-(constComplex&c); friendostream&operator<<(ostream&os,Complex&com); friendistream&operator>>(istream&is,Complex&com); voidDisplay(); private: doublereal; doubleimag; }; voidComplex: : Display() { cout<<"("< } istream&operator>>(istream&is,Complex&com) { is>>com.real>>com.imag; returnis; } ostream&operator<<(ostream&os,Complex&com) { if(com.real==0&&com.imag==0)os<<"0"; elseif(com.real==0)os< elseif(com.imag==0)os< elseif(com.imag>0)os< elseos< returnos; } ComplexComplex: : operator+(constComplex&c) { returnComplex(real+c.real,imag+c.imag); } ComplexComplex: : operator-(constComplex&c) { returnComplex(real-c.real,imag-c.imag); } Complex: : Complex(doubler,doublei) { real=r;imag=i; } intmain() { Complexc1,c2,c3; cin>>c1>>c2; cout<<"("< c3=c1+c2; cout< cout<<"("< c3=c1-c2; cout< return0; } 1255: 多态-运算符重载2 Description 实现Array类的>>、<<的运算符重载。 已知Array类的定义(不允许增加其它成员函数)及main中的代码如下(不允许修改): classArray{ public: Array();//初始化length=0 voidInsert(inti,doublex);//在下标i处插入x friendostream&operator<<(ostream&out,Array&arr);//<<运算符重载 friendistream&operator>>(istream&in,Array&arr);//>>运算符重载 private: doubledata[MaxSize];//存储元素,MaxSize为常量,需先定义 intlength;//顺序表实际长度 }; intmain(){ Arraya; cin>>a;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 参考 代码 分析