This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

| Simple RTTI For C++ Submitted by

This is some very simple RTTI (run time type information) code that you can use for C++. Similar to Java's instanceof operator, it allows you to take a base pointer from some object and see if it is an instance of a derived class.
It consists of some simple defines:

    #define setClassname0(name) \
     virtual char *getClassname(){return name;} \
     virtual bool isInstanceOf(const char *classname)
     {return (strcmp(classname,name)==0 ? true : false);}

    #define setClassname1(name,parent) \
     virtual char *getClassname(){return name;} \
     virtual bool isInstanceOf(const char *classname)
     {return (strcmp(classname,name)==0 ? true : parent::isInstanceOf(classname));}

    #define setClassname2(name,parent1,parent2) \
     virtual char *getClassname(){return name;} \
     virtual bool isInstanceOf(const char *classname)
     {return (strcmp(classname,name)==0 ? true : (parent1::isInstanceOf(classname) || parent2::isInstanceOf(classname)));}

And say you have the following code:

    class Furniture{
    public:
        setClassname0("Furniture");
        ...
    };

    class Chair:public Furniture{
    public:
        setClassname1("Chair",Furniture);
        ...
    };

    class Table:public Furniture{
    public:
        setClassname1("Table",Furniture);
        void doTableStuff();
        ...
    };

And if you have a pointer to a Furniture, you could check to see if it is really an instance of a Table or not, before you actually make the cast:

    Furniture *pFurniture=getSomeFurniture();

    if(pFurniture-isInstanceOf("Table"){
        ((Table*)pFurniture)-doTableStuff();
    }

So in this case, pFurniture->isInstanceOf("Table") would return true, pFurniture->isInstanceOf("Furniture") would also return true, but pFurniture->isInstanceOf("Chair") would return false.
The setClassname2 could be used if you wanted to do multiple inheritance.
Hope this might be useful to someone. And anyone can use this code for whatever.

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.