/*
题目63:编写C++程序完成以下功能:
(1)声明一个纯虚函数类Shape(形状),其中包含来计算面积、计算周长的方法;
(2)从Shape派生两个类矩形和圆形;
(3)从矩形派生正方形;
(4)分别实现派生类构造函数、析构函数和其他方法;
(5)创建派生类的对象,观察构造函数、析构函数调用次序;
(6)利用抽象类做函数参数(基类指针指向子类对象,多态特性),计算不同对象的面积和周长。
*/
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#define PI 3.14
//形状类
class Shape{
public:
//计算面积
virtual double ComputeArea() = 0;
//计算周长
virtual double ComputePerimeter() = 0;
//返回名称
virtual char* PrintName() = 0;
};
//圆类
class Circle :public Shape{
public:
Circle(int r){
this->r = r;
}
virtual char* PrintName(){
return "圆";
}
//计算面积
virtual double ComputeArea(){
return PI*r*r;
}
//计算周长
virtual double ComputePerimeter(){
return 2* PI*r;
}
private:
int r;
};
//矩形类
class Rectangle :public Shape{
public:
Rectangle(int w,int h){
width = w;
height = h;
}
virtual char* PrintName(){
return "矩形";
}
//计算面积
virtual double ComputeArea(){
return width*height;
}
//计算周长
virtual double ComputePerimeter(){
return 2 * (width+height);
}
protected:
int width;
int height;
};
//正方形类
class Square :public Rectangle{
public:
Square(int edge) :Rectangle(edge, edge){}
virtual char* PrintName(){
return "正方形";
}
};
void ProtectA(Shape *sp){
printf("%s的面积是%f\n", sp->PrintName(), sp->ComputeArea());
printf("%s的周长是%f\n", sp->PrintName(), sp->ComputePerimeter());
}
void main(){
//定义圆对象
Circle c1(1);
ProtectA(&c1);
//定义矩形对象
Rectangle r1(2, 3);
ProtectA(&r1);
//定义正方形对象
Square sq1(5);
ProtectA(&sq1);
printf("程序执行完毕!\n");
system("pause");
}
![](https://images2015.cnblogs.com/blog/644743/201607/644743-20160710210134796-425991684.png)