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