| 
|   | RTTI (const char *inName, int inSize, pCreateObjectFunction inCreateObject, pDestructObjectFunction inDestructObject) | 
|   | Constructor.  More...
  | 
|   | 
|   | RTTI (const char *inName, int inSize, pCreateObjectFunction inCreateObject, pDestructObjectFunction inDestructObject, pCreateRTTIFunction inCreateRTTI) | 
|   | 
| const char *  | GetName () const | 
|   | 
| void  | SetName (const char *inName) | 
|   | 
| int  | GetSize () const | 
|   | 
| bool  | IsAbstract () const | 
|   | 
| int  | GetBaseClassCount () const | 
|   | 
| const RTTI *  | GetBaseClass (int inIdx) const | 
|   | 
| uint32  | GetHash () const | 
|   | 
| void *  | CreateObject () const | 
|   | Create an object of this type (returns nullptr if the object is abstract)  More...
  | 
|   | 
| void  | DestructObject (void *inObject) const | 
|   | Destruct object of this type (does nothing if the object is abstract)  More...
  | 
|   | 
| void  | AddBaseClass (const RTTI *inRTTI, int inOffset) | 
|   | Add base class.  More...
  | 
|   | 
| bool  | operator== (const RTTI &inRHS) const | 
|   | Equality operators.  More...
  | 
|   | 
| bool  | operator!= (const RTTI &inRHS) const | 
|   | 
| bool  | IsKindOf (const RTTI *inRTTI) const | 
|   | Test if this class is derived from class of type inRTTI.  More...
  | 
|   | 
| const void *  | CastTo (const void *inObject, const RTTI *inRTTI) const | 
|   | Cast inObject of this type to object of type inRTTI, returns nullptr if the cast is unsuccessful.  More...
  | 
|   | 
| void  | AddAttribute (const SerializableAttribute &inAttribute) | 
|   | Attribute access.  More...
  | 
|   | 
| int  | GetAttributeCount () const | 
|   | 
| const SerializableAttribute &  | GetAttribute (int inIdx) const | 
|   | 
Light weight runtime type information system. This way we don't need to turn on the default RTTI system of the compiler (introducing a possible overhead for every class)
Notes:
- An extra virtual member function is added. This adds 8 bytes to the size of an instance of the class (unless you are already using virtual functions).
 
To use RTTI on a specific class use:
Header file: 
class Foo
{
    JPH_DECLARE_RTTI_VIRTUAL_BASE(Foo)
}
class Bar : public Foo
{
    JPH_DECLARE_RTTI_VIRTUAL(Bar)
};
 Implementation file: 
JPH_IMPLEMENT_RTTI_VIRTUAL_BASE(Foo)
{
}
JPH_IMPLEMENT_RTTI_VIRTUAL(Bar)
{
    JPH_ADD_BASE_CLASS(Bar, Foo) // Multiple inheritance is allowed, just do JPH_ADD_BASE_CLASS for every base class
}
 For abstract classes use:
Header file: 
class Foo
{
    JPH_DECLARE_RTTI_ABSTRACT_BASE(Foo)
public:
    virtual void AbstractFunction() = 0;
}
class Bar : public Foo
{
    JPH_DECLARE_RTTI_VIRTUAL(Bar)
public:
    virtual void AbstractFunction() { } // Function is now implemented so this class is no longer abstract
};
 Implementation file: 
JPH_IMPLEMENT_RTTI_ABSTRACT_BASE(Foo)
{
}
JPH_IMPLEMENT_RTTI_VIRTUAL(Bar)
{
    JPH_ADD_BASE_CLASS(Bar, Foo)
}
 Example of usage in a program: 
Foo *foo_ptr = new Foo;
Foo *bar_ptr = new Bar;
IsType(foo_ptr, RTTI(Bar)) returns false
IsType(bar_ptr, RTTI(Bar)) returns true
IsKindOf(foo_ptr, RTTI(Bar)) returns false
IsKindOf(bar_ptr, RTTI(Foo)) returns true
IsKindOf(bar_ptr, RTTI(Bar)) returns true
StaticCast<Bar>(foo_ptr) asserts and returns foo_ptr casted to Bar *
StaticCast<Bar>(bar_ptr) returns bar_ptr casted to Bar *
DynamicCast<Bar>(foo_ptr) returns nullptr
DynamicCast<Bar>(bar_ptr) returns bar_ptr casted to Bar *
 Other feature of DynamicCast: 
class A { int data[5]; };
class B { int data[7]; };
class C : public A, public B { int data[9]; };
C *c = new C;
A *a = c;
 Note that: 
B *b = (B *)a;
 generates an invalid pointer, 
B *b = StaticCast<B>(a);
 doesn't compile, and 
B *b = DynamicCast<B>(a);
 does the correct cast