home *** CD-ROM | disk | FTP | other *** search
/ Using Visual C++ 4 (Special Edition) / Using_Visual_C_4_Special_Edition_QUE_1996.iso / ch18 / salad2.cpp < prev    next >
C/C++ Source or Header  |  1995-09-12  |  2KB  |  117 lines

  1. #include <iostream.h>
  2.  
  3. // Some miscellaneous definitions we will need
  4. typedef enum {
  5.     WHOLE,
  6.     SHREDDED,
  7.     GRATED,
  8.     SLICED,
  9.     CHOPPED
  10. } FoodState;
  11.  
  12. // The top of the inheritance tree
  13. class Food {
  14. public:
  15.     // Constructor
  16.     Food(const FoodState = WHOLE);
  17.  
  18.     // Virtual methods - all food
  19.     // must be able to set and return
  20.     // its state. These functions also
  21.     // ensure that Food is polymorphic
  22.     // and can use RTTI.
  23.     virtual FoodState GetState() const;
  24.     virtual void SetState(const FoodState);
  25.  
  26. private:
  27.     // Private member data
  28.     FoodState theFoodState;
  29. };
  30.  
  31. // Food constructor
  32. Food::Food(const FoodState newState)
  33. {
  34.     SetState(newState);
  35. }
  36.  
  37. // Getter and setter virtual methods
  38. FoodState Food::GetState() const
  39. {
  40.     return theFoodState;
  41. }
  42.  
  43. void Food::SetState(const FoodState newState)
  44. {
  45.     theFoodState = newState;
  46. }
  47.  
  48. // Overload << so we can display our state
  49. ostream& operator<<(ostream& outstrm,
  50.                     Food&    theFood)
  51. {
  52.     switch(theFood.GetState()) {
  53.         case WHOLE:     outstrm  << "Whole";
  54.                         break;
  55.         case SHREDDED:  outstrm << "Shredded";
  56.                         break;
  57.         case GRATED:    outstrm << "Grated";
  58.                         break;
  59.         case SLICED:    outstrm << "Sliced";
  60.                         break;
  61.         case CHOPPED:   outstrm << "Chopped";
  62.                         break;
  63.         default:
  64.             outstrm << "Bad state!";
  65.     }
  66.     return outstrm;
  67. }
  68.  
  69.  
  70. // Intermediate class grouping
  71. class SaladIngredient : public Food {
  72. public:
  73.     // Pure virtual function which any
  74.     // salad ingredient class must
  75.     // provide
  76.     virtual void ProcessIngredient() = 0;
  77. };
  78.  
  79.  
  80. // Individual food types
  81. class Apple : public SaladIngredient {
  82. public:
  83.     void ProcessIngredient() { SetState(CHOPPED); }
  84. };
  85.  
  86. class Cheese : public Food {
  87. public:
  88.     void ProcessIngredient() { SetState(GRATED); }
  89. };
  90.  
  91. class Lettuce : public Food {
  92. public:
  93.     void ProcessIngredient() { SetState(SHREDDED); }
  94. };
  95.  
  96.  
  97. // LetÆs prepare a salad
  98. void main()
  99. {
  100.     Lettuce     MyLettuce;
  101.     Apple       MyApple;
  102.     Cheese      MyCheese;
  103.  
  104.     // Process the vegetables
  105.     MyLettuce.ProcessIngredient();
  106.     MyApple.ProcessIngredient();
  107.     MyCheese.ProcessIngredient();
  108.  
  109.     // Show what weÆve done
  110.     cout << "The lettuce is ";
  111.     cout << MyLettuce << "\n";
  112.     cout << "The apple is ";
  113.     cout << MyApple << "\n";
  114.     cout << "The cheese is ";
  115.     cout << MyCheese << "\n";
  116. }
  117.