#property strict #define DYNAMIC_CAST(stringCLASS,typenameBASE) virtual Polymorphic* dynamic_cast(string c){ return( (c==stringCLASS) ? GetPointer(this) : typenameBASE::dynamic_cast(c) );} class Polymorphic{ public: virtual Polymorphic* dynamic_cast(string c){ return(NULL); }; }; class base : public Polymorphic{ public: DYNAMIC_CAST("base",Polymorphic); void iAM(int i){ Print("iam a base "+i); } }; class derv : public base{ public: DYNAMIC_CAST("derv",base); void iAM(int i){ Print("iam a derv:base "+i); } }; class other : public base{ public: DYNAMIC_CAST("other",base); void iAM(int i){ Print("iam a other:base "+i); } }; class trip : public derv{ public: DYNAMIC_CAST("trip",derv); void iAM(int i){ Print("iam a trip:derv "+i); } }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart(){ base* obj = new other; derv* d=(derv*) obj.dynamic_cast("derv"); if(d) d.iAM(__LINE__); // other* o=(other*) obj.dynamic_cast("other"); if(o) o.iAM(__LINE__); // iam a other:base 26 trip* t=(trip*) obj.dynamic_cast("trip"); if(t) t.iAM(__LINE__); // delete obj; obj = new trip; d=(derv*) obj.dynamic_cast("derv"); if(d) d.iAM(__LINE__); // iam a derv:base 29 o=(other*)obj.dynamic_cast("other"); if(o) o.iAM(__LINE__); // t=(trip*) obj.dynamic_cast("trip"); if(t) t.iAM(__LINE__); // iam a trip:derv 31 delete obj; } //+------------------------------------------------------------------+