shape.cpp
#include <iostream> //cout,endl 相关函数的声明
#define PI 3.1415926 //定义一个PI宏
using namespace std; //设定名称空间
class Shape //定义一个Shape的抽象基类
{
public:
virtual float getArea()=0; //声明一个纯虚函数
Shape(float x=0); //声明一个带默认参值的构造函数
protected:
float h; //成员变量
};
Shape::Shape(float x) //构造函数的实现
{
h=x;
}
class Circle:public Shape //定义一个继成自Shape抽象类的派生类Circle
{
public:
Circle(float r=0); //构造方法
float getArea(); //对getArea的重写
};
Circle::Circle(float r):Shape(r) //构造函数的实现,因为圆只有一个表示半径的成员变量,所以使用基类的构造方法进行初始化就够了
{}
float Circle::getArea() //对getArea的实现
{
return PI*h*h;
}
class Rectangle:public Shape //定义一个继成自Shape抽象类的派生类Rectangle
{
public:
Rectangle(float h=0,float x=0); //声明构造方法
float getArea(); //对getArea的重写
protected:
float w; //多了一个表示宽度的成员变量
};
Rectangle::Rectangle(float h,float x):Shape(h) //构造函数的实现,因为矩形多了一个表示宽度的成员变量,所以使用基类的构造方法进行初始化后,再只用对宽度单独赋值就可以了
{
w=x;
}
float Rectangle::getArea() //对getArea的实现
{
return h*w;
}
class Trapezoid:public Shape //定义一个继成自Shape抽象类的派生类Trapezoid
{
public:
Trapezoid(float h=0,float x=0,float y=0); //声明构造方法
float getArea(); //对getArea的重写
protected:
float a,b; //多了两个分别表示上底和下底的成员变量
};
Trapezoid::Trapezoid(float h , float x, float y):Shape(h) //构造函数的实现,因为梯形多了两个分别表示上下底的成员变量,所以使用基类的构造方法进行初始化后,再只用对两底赋值就可以了
{
a=x;
b=y;
}
float Trapezoid::getArea() //对getArea的重写
{
return h*(a+b)/2;
}
int main()
{
Shape *p[3]={NULL,NULL,NULL}; //定义三个基类(抽象类)指针
p[0] = new Circle(2); //申请一个Circle类对象,初始化半径为2,指针赋给p[0]
p[1] = new Rectangle(2,5); //申请一个Rectangle类对象,初始化高为2,宽为5,指针赋给p[1]
p[2] = new Trapezoid(2,5,8); //申请一个Trapezoid类对象,初始化高为2,上底为5,下底为8,指针赋给p[2]
cout<<"Circle area:"<<p[0]->getArea()<<endl;
cout<<"Rectangle area:"<<p[1]->getArea()<<endl;
cout<<"Trapezoid area:"<<p[2]->getArea()<<endl;
cout<<"the total area:"<<p[0]->getArea()+p[1]->getArea()+p[2]->getArea() <<endl;
delete p[0];
delete p[1];
delete p[2]; //进行清场工作
return 0;
}
emacs@ubuntu:~/c++$ alias gtx
alias gtx='g++ -Wall -g -o'
emacs@ubuntu:~/c++$ gtx shape.x shape.cpp
emacs@ubuntu:~/c++$ ./shape.x
Circle area:12.5664
Rectangle area:10
Trapezoid area:13
the total area:35.5664
emacs@ubuntu:~/c++$
编译执行过程中没有报错,从结果来看,符合预期
弄清下面概念对掌握c++很有帮助
原文地址
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。