抽象基类
Shape.h
#pragma once
class Shape
{
public:
virtual void shapeName()const = 0;
virtual void printArea()const = 0;
};
圆形
Circle.h
#pragma once
#include "Shape.h"
#include<iostream>
using namespace std;
class Circle :
public Shape
{
public:
Circle(float r=0);
void setRadius(float);
float getRadius()const;
virtual void shapeName()const { cout << "Circle:"; }
virtual void printArea()const{cout<<"面积为:"<<3.14159*radius*radius<<endl;}
friend ostream &operator<<(ostream &, const Circle &);
protected:
float radius;
};
Circle.cpp
#include "Circle.h"
Circle::Circle(float r):radius(r)
{
}
void Circle::setRadius(float r)
{
radius = r;
}
float Circle::getRadius()const
{
return radius;
}
ostream &operator<<(ostream &output, const Circle &c)
{
output << "r=" << c.radius;
return output;
}
矩形
Rectangle.h
#pragma once
#include "Shape.h"
#include<iostream>
using namespace std;
class REctangle :
public Shape
{
public:
REctangle(float x=0,float y=0);
void setXY(float, float);
float getX()const;
float getY()const;
virtual void shapeName()const { cout << "REctangle:"; }
virtual void printArea()const { cout << "面积为:" << _x*_y << endl; }
friend ostream &operator<<(ostream &, const REctangle &);
protected:
float _x, _y;
};
Rectangle.cpp
#include "Rectangle.h"
REctangle::REctangle(float x,float y):_x(x),_y(y)
{
}
void REctangle::setXY(float x, float y)
{
_x = x;
_y = y;
}
float REctangle::getX()const
{
return _x;
}
float REctangle::getY()const
{
return _y;
}
ostream &operator<<(ostream &output, const REctangle &r)
{
output << "x=" << r._x << ",y=" << r._y;
return output;
}
三角形
Triangle.h
#pragma once
#include "Shape.h"
#include<iostream>
using namespace std;
class Triangle :
public Shape
{
public:
Triangle(float x=0,float h=0);
void setXH(float, float);
float getX()const;
float getH()const;
virtual void shapeName()const { cout << "Triangle:"; }
virtual void printArea()const { cout << "面积为:" << (_x * height)/2 << endl; }
friend ostream &operator<<(ostream &, const Triangle &);
protected:
float _x, height;
};
Triangle.cpp
#include "Triangle.h"
Triangle::Triangle(float x,float h):_x(x),height(h)
{
}
void Triangle::setXH(float x, float h)
{
_x = x;
height = h;
}
float Triangle::getX()const
{
return _x;
}
float Triangle::getH()const
{
return height;
}
ostream &operator<<(ostream &output, const Triangle &t)
{
output << "x=" << t._x << ",h=" << t.height;
return output;
}
主函数
main.cpp
#include<iostream>
#include<Windows.h>
#include"Circle.h"
#include"Rectangle.h"
#include"Triangle.h"
using namespace std;
int main()
{
Circle circle(5);
REctangle rectangle(5, 4);
Triangle triangle(5, 4);
circle.shapeName();
cout << circle << endl;
rectangle.shapeName();
cout << rectangle << endl;
triangle.shapeName();
cout << triangle << endl;
cout << endl;
Shape *pt;
pt = &circle;
pt->shapeName();
pt->printArea();
pt = &rectangle;
pt->shapeName();
pt->printArea();
pt = ▵
pt->shapeName();
pt->printArea();
system("pause");
return 0;
}
运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200210233244777.png)