C++ Enum Inheritance Example
#include "stdio.h"
// "Base" enum defining three colors.
enum Color
{
Red = 0,
Blue,
Green,
LastColor,
FinalColor = 65535
};
// Object for displaying the Color enum.
class ColorPrinter
{
public:
virtual void printColor(Color color);
};
void
ColorPrinter::printColor(Color color)
{
switch (color)
{
case Color::Red:
printf("Red");
break;
case Color::Blue:
printf("Blue");
break;
case Color::Green:
printf("Green");
break;
default:
printf("Unknown");
break;
}
}
// "Derived" enum defining pastels.
// Note the use of Color::LastColor to pick up the enumeration where
// Color left off.
// Similarly define LastPastel for an enum to extend Pastel.
enum Pastel
{
Turqoise = Color::LastColor,
Lavender,
Peach,
LastPastel,
};
// Object for displaying the Pastel enum.
class PastelColorPrinter : public ColorPrinter
{
public:
virtual void printColor(Color color);
void printColor(Pastel pastel);
};
// Override for Color type, defer to Pastel implementation.
void
PastelColorPrinter::printColor(Color color)
{
this->printColor((Pastel)color);
}
void
PastelColorPrinter::printColor(Pastel pastel)
{
switch (pastel)
{
case Pastel::Turqoise:
printf("Turqoise");
break;
case Pastel::Lavender:
printf("Lavender");
break;
case Pastel::Peach:
printf("Peach");
break;
default:
if (pastel < Color::LastColor)
{
// An enum is just an integer so we can check the range.
// Defer to base implementation of printColor.
ColorPrinter::printColor((Color)pastel);
}
else
{
printf("Unknown");
}
break;
}
}
// Example class which demonstrates using Color with no direct
// knowledge of Pastel.
class Designer
{
public:
void displayPreference(Color color);
void installColorPrinter(ColorPrinter * colorPrinter);
private:
ColorPrinter * colorPrinter;
};
void
Designer::displayPreference(Color color)
{
printf("I like ");
colorPrinter->printColor(color);
printf("\n");
}
void
Designer::installColorPrinter(ColorPrinter * colorPrinter)
{
this->colorPrinter = colorPrinter;
}
// Demonstrate use of Designer.
int main()
{
PastelColorPrinter pastelColorPrinter = PastelColorPrinter();
Designer designer = Designer();
designer.installColorPrinter(&pastelColorPrinter);
designer.displayPreference(Color::Red);
designer.displayPreference((Color)Pastel::Lavender);
return 0;
}