桂电C++面向对象程序设计实验 : 实验六 多态性与虚函数

桂电C++面向对象程序设计实验: 实验六 多态性与虚函数

1.声明Point(点)类,由Point类派生出Circle(圆)类,再由Circle类派生出Cylinder(圆柱体)类。将类的定义部分分别作为3个头文件,对它们成员函数的声明部分分别作为3个源文件(.cpp文件),在主函数中用#include命令把它们包含进来,形成一个完整的程序,并上机运行。本题是《C++面向对象程序设计》第6章第1题。

2.在《C++面向对象程序设计》第6章例6.3的基础上作以下修改,并作必要的讨论。
① 把构造函数修改为带参数的函数,在建立对象时初始化。
② 先不将析构函数声明为virtual,在main函数中另设一个指向Circle类对象的指针变量,使它指向grad1。
③ 不作第②点的修改而将析构函数声明为virtual,运行程序,分析结果。
本题是《C++面向对象程序设计》第6章第3题。

3.声明抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea分别输出以上三者的面积,3个图形的数据在定义对象时给定。本题是《C++面向对象程序设计》第6章第4题。

6.1 源码

"point.h"

#define POINT_H
#include <iostream>
using namespace std;
class Point
{
public:	
	Point(double x=0, double y=0);
	void setPoint(double, double);
	double getX() const{return x;}
	double getY() const{return y;}
	friend ostream & operator<<(ostream &, const Point &);
protected:
	double x, y;
};
#endif

"point.cpp"

#include"poin.h"
Point::Point(double a, double b)
{
	x=a; y=b;
}
void Point::setPoint(double a, double b)
{
	x=a; y=b;
}
ostream& operator<<(ostream &output, const Point &p)
{
	output<<"["<<p.x<<", "<<p.y<<"]"<<endl;
	return output;
}

#endif


"cricle.h"

#ifndef CIRCLE_H//circle.h
#define CIRCLE_H
#include"point.h"
class Circle: public Point
{
public:
	Circle (double x=0, double y=0, double r=0);
	void setRadius(double);
	double getRadius() const;
	double area() const;
	friend ostream& operator<<(ostream &, const Circle &);
protected:
	double radius;
};

"circle.cpp"

#include"circle.h"//circle.cpp
Circle::Circle(double a, double b, double r): Point(a, b), radius(r){}
void Circle::setRadius(double r){radius=r;}
double Circle::getRadius() const { return radius;}
double Circle::area() const {return 3.14159*radius*radius;}
ostream& operator<<(ostream &output, const Circle &c)
{
	output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.radius<<", area="<<c.area()<<endl;
	return output;
}
#endif

"cylinder.h"

#ifndef CYLINDER_H//cylinder.h
#define CYLINDER_H
#include"point.h"
#include"circle.h"
class Cylinder: public Circle
{
public:
	Cylinder(double x=0, double y=0, double r=0, double h=0);
	void setHeight(double);
	double getHeight() const;
	double area() const;
	double volume() const;
	friend ostream& operator<<(ostream &, const Cylinder &);
protected:
	double height;
};
#endif

"cylinder.cpp"

#include"cylinder.h"//cylinder.cpp
Cylinder::Cylinder(double a, double b, double r, double h)
	:Circle(a, b, r), height(h){}
void Cylinder::setHeight(double h) {height=h;}
double Cylinder::getHeight() const {return height;}
double Cylinder::area() const {return 2*Circle::area()+2*3.14159*radius*height;}
double Cylinder::volume() const {return Circle::area()*height;}
ostream& operator<<(ostream &output, const Cylinder &cy)
{
	output<<"Center=["<<cy.x<<", "<<cy.y<<"], r="<<cy.radius<<", h="<<cy.height
		<<"\narea="<<cy.area()<<", volume="<<cy.volume()<<endl;
	return output;
}

"main.cpp"

#include"cylinder.h"//主函数
int main()
{
	Cylinder cy1(3.5, 6.4, 5.2, 10);
	cout<<"\noriginal cylinder:\nx="<<cy1.getX()<<", y="<<cy1.getY()<<", r="
		<<cy1.getRadius()<<", h="<<cy1.getHeight()<<"\narea="<<cy1.area()
		<<", volume="<<cy1.volume()<<endl;
	cy1.setHeight(15);
	cy1.setRadius(7.5);
	cy1.setPoint(5, 5);
	cout<<"\nnew cylinder:\n"<<cy1;
	Point &pRef=cy1;
	cout<<"\npRef as a Point:"<<pRef;
	Circle &cRef=cy1;
	cout<<"\nRef as a Circle:"<<cRef;
}

6.2 源码

#include<iostream>//2
using namespace std;
class Point
{
public:
	Point(float a,float b):x(a),y(b){}
	virtual ~Point(){cout<<"executing Point destructor"<<endl;}
private:
	float x;
	float y;
};
class Circle:public Point
{
public:
	Circle(float a,float b,float r):Point(a,b),radius(r){}	
	virtual ~Circle(){cout<<"executing Circle destructor"<<endl;}
private:
	float radius;
};
int main()
{
	Circle cr(2.5,1.8,4.5);
	Circle *p;
	p=&c1;
}

6.3 源码

#include<iostream>//3
#include<cmath>
using namespace std;
const double PI = 3.1415926;
class Shape
{
public:
	virtual double area()const = 0;
};
class Circle :public Shape
{
public:
	Circle(double r) :radius(r){}
	virtual double area()const{ return PI*radius*radius; };
protected:
	double	radius;
};
class Rectangle :public Shape
{
public:
	Rectangle(double c, double k) :chang(c), kuan(k){}
	virtual double area()const{ return chang*kuan; };
protected:
	double chang, kuan;
};
class Triangle :public Shape
{
public:
	Triangle(double a, double b, double c) :a(a), b(b), c(c),p((a+b+c)/2){}
	virtual double area()const{ return sqrt(p*(p - a)*(p - b)*(p - c)); };
protected:
	double a, b, c, p;
};
void print(const Shape &s)
{
	cout << s.area() << endl;
}
int main()
{
	Circle yuan(4.2);
	Rectangle jx(3.5, 4.2);
	Triangle sjx(3, 4, 5);
	cout << "圆的面积为:";
	print(yuan);
	cout << "矩形的面积为:";
	print(jx);
	cout << "三角形的面积为:";
	print(sjx);
}
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值