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