Listing 2

// meal2.cxx - second attempt at pricing a meal
#include <stream.h>

enum ENTREE {Steak,Fish};
enum DESSERT {Pie,Cake,Jello};
enum APPETIZER {Melon,ShrimpCocktail};

class Dessert // An abstract class - never instantiated by itself
   {
public:
   virtual double cost()
       { printf("Dessert error, no cost() provided\n"); return 0;}
   };

class Jello_obj : public Dessert
   {
public:
   double cost() {return .60;}
   };

class Pie_obj : public Dessert
   {
public:
   double cost() {return 1.50;}
   };

class Cake_obj : public Dessert
   {
public:
   };

class Entree
   {
public:
   virtual double cost()
       { printf("Entree error, no cost() provided\n"); return 0;}
   };

class Fish_obj : public Entree
   {
public:
   double cost() {return 4.00;}
   };

class Steak_obj : public Entree
   {
public:
   double cost() {return 7.50;}
   };

class Appetizer
   {
public:
   virtual double cost()
       { printf("Appetizer error, no cost() provided\n"); return 0;}
   };

class Cocktail_obj : public Appetizer
   {
public:
   double cost() { return 2.00;}
   };

class Melon_obj : public Appetizer
   {
public:
   double cost() { return .85;}
   };

class Meal
   {
   Appetizer *a;
   Entree *e;
   Dessert *d;
public:
   Meal (APPETIZER=Melon,ENTREE=Fish,DESSERT=Jello);
   Meal();
   double cost();
   };

//------------------------------------------
// class member function definitions

double Meal::cost() {return d->cost() + a->cost() + e->cost(); }

Meal::Meal(APPETIZER aval,ENTREE eval,DESSERT dval)
   {
   if ( dval == Jello ) d = new Jello_obj;
   else if ( dval == Pie ) d = new Pie_obj;
   else d = new Cake_obj;
   if ( eval == Steak ) e = new Steak_obj;
   else e = new Fish_obj;
   if ( aval == Melon ) a = new Melon_obj;
   else a = new Cocktail_obj;
   }
Meal::Meal () { delete a; delete e; delete d; }
//-------------------------------------------

main()
   {
   Meal m1(Melon,Fish,Jello);
   Meal m2(Melon,Steak,Pie);
   Meal m3(ShrimpCocktail,Steak,Cake);
   printf("Meal1 Price %6.2f, Meal2 price %6.2f, Meal3 price %6.2f\n"
       ,m1.cost(),m2.cost(),m3.cost());
   }
// ---- sample output below -----
Dessert error, no cost() provided
Meal1 Price  5.45,  Meal2 price   9.85, Meal3 price   9.50