|
ex7-15.cpp - Example 7-15 Pure Virtual Functions and Abstract classes - shape class |
// 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,double);
void print(void) const;
virtual double area(void) const = 0; // pure virtual function
virtual double girth(void) const = 0; // pure virtual function
};
shape::shape(double c_x, double c_y) : x(c_x),y(c_y) {}
void shape::print(void) const
{
cout << '(' << x << ',' << y << ')';
}
class square : public shape
{
private:
double side;
public:
square(double c_x,double c_y, double s);
double get_side(void) { return side; }
double area(void) const;
double girth(void) const;
};
square::square(double c_x, double c_y, double s) : shape(c_x,c_y)
{
side = s;
}
double square::area(void) const
{
return side * side;
}
double square::girth(void) 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(void);
double area(void) const;
double girth(void) 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(void)
{
cout << a << ' ' << b << ' ' << c;
return;
}
double triangle::area(void) const
{
double s = (a + b + c) / 2.; // semiperimeter
return sqrt(s*(s-a)*(s-b)*(s-c));
}
double triangle::girth(void) 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(void) { return radius; }
double area(void) const;
double girth(void) const;
};
circle::circle(double c_x, double c_y, double r) : shape(c_x,c_y)
{
radius = r;
}
double circle::area(void) const
{
return pi*radius*radius;
}
double circle::girth(void) const
{
return 2.*pi*radius;
}
int main(void)
{
// shape sh(6,7); can't create instance of abstract class
circle c(3,4,5);
cout << "circle c - center: ";
c.print();
cout << " radius = " << c.get_radius();
cout << " area = " << c.area();
cout << " circumference = " << c.girth() << endl;
square s(5.,2.,1.);
cout << "square s - center: ";
s.print();
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: ";
t.print();
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;
return 0;
}
CIS27: Programming in C++ Instructor: Joe Bentley