class ObjInterface1; class ObjInterface2; class ObjFullInterface; class Obj2Interface1; class Obj2Interface2; class Obj2FullInterface; class BaseObj { }; class Obj : public BaseObj { public: ObjInterface1* GetInterface1() { return (ObjInterface1*)this; } ObjInterface2* GetInterface2() { return (ObjInterface2*)this; } ObjFullInterface* GetFullInterface() { return (ObjFullInterface*)this; } }; class ObjInterface1 : public BaseObj { public: void I1_AFunc() {} }; class ObjInterface2 : public BaseObj { public: void I2_AFunc() {} }; class ObjFullInterface : public ObjInterface1, public ObjInterface2 { }; class BaseObj2 : public BaseObj { }; class Obj2 : public BaseObj2 { public: Obj2Interface1* GetInterface1() { return (Obj2Interface1*)this; } Obj2Interface2* GetInterface2() { return (Obj2Interface2*)this; } Obj2FullInterface* GetFullInterface() { return (Obj2FullInterface*)this; } }; class Obj2Interface1 : public BaseObj2, public ObjInterface1 { public: void I1_BFunc() {} }; class Obj2Interface2 : public BaseObj2, public ObjInterface2 { public: void I2_BFunc() {} }; class Obj2FullInterface : public Obj2Interface1, public Obj2Interface2 { }; void Test() { Obj *obj = (Obj*)new ObjFullInterface; obj->GetInterface1()->I1_AFunc(); Obj2 *obj2 = (Obj2*)new Obj2FullInterface; obj2->GetInterface1()->I1_BFunc(); }