Simulating Polymorphic Operators in C++
by Michael Dowell 

Listing One

class Employee 
{
public:
  friend ostream& operator<<(ostream& os, const Employee & aEmployee);
  virtual ostream& print(ostream& os) const;
};
class Manager : public Employee
{
public:
  friend ostream& operator<<(ostream& os, const Manager & aManager);
  virtual ostream& print(ostream& os) const;
};
ostream& Employee::print(ostream& os) const
{
// code to print the Employee class
    return os;
}
ostream& operator<<(ostream& os, const Employee & aEmployee)
{
    return aEmployee.print(os);
}
ostream& Manager::print(ostream& os) const
{
    Employee::print(os);
    // code to print the Manager class
    return os;
}
ostream& operator<<(ostream& os, const Manager & aManager)
{
    return aManager.print(os);
}


Listing Two

ostream& operator<<(ostream& os, const Employee& a Employee)
{
// code to print the Employee class
    if (dynamic_cast<const Manager*>(&a Employee) != NULL)
        os << *(dynamic_cast<const Manager*>(&a Employee));
    return os;
}


Listing Three

ostream& operator<<(ostream& os, const Manager& aManager)
{
    static bool Manager_printed = false;
    if (Manager_printed == false)
   {
        Manager_printed = true;
        os << static_cast<const Employee&>(aManager);
        Manager_printed = false;        
// code to print the Manager class
    }
    return os;
}


Listing Four

ostream& operator<<(ostream& os, const Employee& a Employee)
{
    static bool Employee_printed = false;
    if (Employee_printed == false)
    {
// code to print the Employee class
        Employee_printed = true; 
        if (dynamic_cast<const Manager*>(&a Employee) != NULL)
            os << *(dynamic_cast<const Manager*>(&a Employee));
        Employee_printed = false;   
    }
    return os;
}


Listing Five

enum type { EMPLOYEE=1, MANAGER=2, SALESPERSON=3 };
class Employee
{
public:
    char _type;
    Employee()  { _type= EMPLOYEE; }
    friend ostream& operator<<(ostream& os, const Employee& aEmployee);
};
class Manager : public Employee
{
public:
    Manager() { _type = MANAGER; }
    friend ostream& operator<<(ostream& os, const Manager& aManager);
};


Listing Six

ostream& operator<<(ostream& os, const Employee& aEmployee)
{
// code to print the Employee class
    if (aEmployee._type == MANAGER)
    {
        const_cast<Employee&>(aEmployee)._type = - aEmployee._type;
        os << static_cast<const Manager&>(aEmployee);
        const_cast<Employee&>(aEmployee)._type = - aEmployee._type;
    }
    else if (aEmployee._type == SALESPERSON)
    {
        const_cast<Employee&>(aEmployee)._type = - aEmployee._type;
        os << static_cast<const Manager&>(aEmployee);
        const_cast<Employee&>(aEmployee)._type = - aEmployee._type;
    }
    return os;
}
ostream& operator<<(ostream& os, const Manager& aManager)
{
    if (aManager._type == MANAGER)
    {
        const_cast<Manager&>(aManager)._type = - aManager._type;
        os << static_cast<const Employee&>(aManager);
        const_cast<Manager&>(aManager)._type = - aManager._type;
    }
// code to print the Manager class
    return os;
}




3


