图形虚基类,定义计算面积跟周长的函数。派生出圆形,三角形,矩形子类,并重新定义基类计算面积与周长的函数。
注意:当基类的指针指向派生类的时候,只能操作派生类中从基类中继承过来的数据。
虚基类:
class graph
{
public:
virtual double perimeter() const= 0;
virtual double area() const= 0;
};
circle类:
#include"graph.h"
class circle:public graph
{
public:
circle(double r):radius(r){};//初始化成员列表
virtual ~circle();
double perimeter() const;
double area() const;
private:
double radius;
};
#include "circle.h"
#define PI 3.14159
double circle::area() const
{
return this->radius*this->radius*PI;
}
double circle::perimeter() const
{
return 2*this->radius*PI;
}
rectangle类:
#include"graph.h"
class rectangle:public graph
{
public:
rectangle(double w,double h):width(w),height(h){};
virtual ~rectangle();
double perimeter() const;
double area() const;
private:
double width;
double height;
};
#include "rectangle.h"
double rectangle::area() const
{
return this->height*this->width;
}
double rectangle::perimeter() const
{
return 2*(this->height+this->width);
}
triangle类:
#include"graph.h"
class triangle:public graph
{
public:
triangle(double a,double b,double c):boder1(a),boder2(b),boder3(c){};
virtual ~triangle();
double area() const;
double perimeter() const;
private:
double boder1;
double boder2;
double boder3;
};
#include "triangle.h"
#include<cmath>
double triangle::area() const
{
double ave = (this->boder1+this->boder2+this->boder3)/2;
return sqrtf(ave*(ave-this->boder1)*(ave-this->boder2)*(ave-this->boder3)); //利用海伦公式
}
double triangle::perimeter() const
{
return this->boder1+this->boder2+this->boder3;
}
主函数:
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<iterator>
#include"circle.h"
#include"graph.h"
#include"triangle.h"
#include"rectangle.h"
using namespace std;
int main()
{
graph* c = new circle(22.3);
graph* r = new rectangle(4.5,6.7);
graph* t = new triangle(2.3,4.4,5.5);
cout<<c->area()<<endl;
cout<<r->area()<<endl;
cout<<t->area()<<endl;
vector<graph*> all;
all.push_back(c);
all.push_back(r);
all.push_back(t);
vector<graph*>::iterator ptr = all.begin();
for(ptr;ptr != all.end();ptr++)
{
cout<<(*ptr)->area()<<endl;
cout<<(*ptr)->perimeter()<<endl;
}
system("pause");
return 0;
}
|