// File: ex7-15.cpp - Abstract classes
#include <iostream> #include <cmath> #include <cstdlib> using namespace std; const double pi = 3.141592654; class Shape { protected: double x; double y; public: Shape(double = 0,double = 0); double get_x() const { return x; } double get_y() const { return y; } virtual double area() const = 0; // pure virtual function
virtual double girth() const = 0; // pure virtual function
}; Shape::Shape(double c_x, double c_y) : x(c_x),y(c_y) {} ostream& operator<<(ostream& out, const Shape& object) { cout << '(' << object.get_x() << ',' << object.get_y() << ')'; return out; } class Square : public Shape { private: double side; public: Square(double c_x,double c_y, double s); double get_side() { return side; } double area() const; double girth() const; }; Square::Square(double c_x, double c_y, double s) : Shape(c_x,c_y), side(s) { } double Square::area() const { return side * side; } double Square::girth() const { return 4.*side; } class Triangle : public Shape { private: double a,b,c; // length of 3 sides
public: Triangle(double c_x,double c_y, double s1, double s2, double s3); void print_sides(); double area() const; double girth() const; }; Triangle::Triangle(double c_x, double c_y, double s1, double s2, double s3) : Shape(c_x,c_y), a(s1), b(s2), c(s3) { } void Triangle::print_sides() { cout << a << ' ' << b << ' ' << c; } double Triangle::area() const { double s = (a + b + c) / 2.; // semiperimeter
return sqrt(s*(s-a)*(s-b)*(s-c)); } double Triangle::girth() const { return a+b+c; } class Circle : public Shape { private: double radius; public: Circle(double c_x, double c_y, double r); double get_radius() { return radius; } double area() const; double girth() const; }; Circle::Circle(double c_x, double c_y, double r) : Shape(c_x,c_y), radius(r) { } double Circle::area() const { return pi*radius*radius; } double Circle::girth() const { return 2.*pi*radius; } int main() { // Shape sh(6,7); can't create instance of abstract class
Circle c(3,4,5); cout << "Circle c - center: "; cout << c << endl; cout << " radius = " << c.get_radius(); cout << " area = " << c.area(); cout << " circumference = " << c.girth() << endl; Square s(5.,2.,1.); cout << "Square s - center: "; cout << s << endl; cout << " side = " << s.get_side(); cout << " area = " << s.area(); cout << " perimeter = " << s.girth() << endl; Triangle t(0,0,3,4,5); cout << "Triangle t - center: "; cout << t << endl; cout << " sides = "; t.print_sides(); cout << " area = " << t.area(); cout << " perimeter = " << t.girth() << endl; cout << "sizeof(double)=" << sizeof(double) << endl; cout << "sizeof(Shape)=" << sizeof(Shape) << endl; cout << "sizeof(Square)=" << sizeof(Square) << endl; cout << "sizeof(Triangle)=" << sizeof(Triangle) << endl; cout << "sizeof(Circle)=" << sizeof(Circle) << endl; }