Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!rutgers!usc!polyslo!ttwang
From: ttwang@polyslo.CalPoly.EDU (Thomas Wang)
Newsgroups: comp.lang.c++
Subject: Re: conceptual problem with related classes derived in parallel
Message-ID: <1989Oct2.181531.25198@polyslo.CalPoly.EDU>
Date: 2 Oct 89 18:15:31 GMT
References: <1079@godot.radonc.unc.edu>
Reply-To: ttwang@polyslo.CalPoly.EDU (Thomas Wang)
Distribution: usa
Organization: Cal Poly State University -- San Luis Obispo
Lines: 62

If what you want is the ability to insert any class of objects into the
list, and at the same time maintain some sort of code re-use, I have some
sort of solution for you.

You must have one single base class that does nothing except building up
a framework for future inheritance.

class god_t
{
private:
  static char* original_name;
protected:
  char* my_name; // the name of the class
public:
  god_t();
  char* class_name() { return my_name; }
  virtual char knows(char*);
};
god_t::god_t()
{
  my_name = original_name = "god_t";
}
virtual char god_t::knows(char* name)
{
  return original_name == name;
}
class int_t: public god_t
{
private:
  static char* original_name;
public:
  int_t();
  virtual char knows(char*);
...
};
int_t::int_t()
{
  my_name = original_name = "int_t";
}
virtual char int_t::knows(char* name)
{
  return (original_name == name) || god_t::knows(name);
}

Now that you always know what class an object is, so you can safely
typecast in an if statement:

god_t* node;
...
if (node->knows(chocolate_t::original_name))
  ((chocolate*) node) ->eat_chocolate();
else
  cout << "cannot eat a non-chocolate object\n";

eat_chocolate() should be a virtual function.


 -Thomas Wang ("This is a fantastic comedy that Ataru and his wife Lum, an
                invader from space, cause excitement involving their neighbors."
                  - from a badly translated Urusei Yatsura poster)

                                                     ttwang@polyslo.calpoly.edu