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
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 //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 //3
#include
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);
}