ciao.
Ho questa classe di esempio:

header:
codice:
// Geometric Tools, LLC
// Copyright (c) 1998-2010
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/Licens...ICENSE_1_0.txt
//
// File Version: 5.0.0 (2010/01/01)

#ifndef WM5RTTI_H
#define WM5RTTI_H

#include "Wm5CoreLIB.h"

namespace Wm5
{

class Rtti
{
public:
    // Construction and destruction.  The name must be unique among all
    // objects in the system.  In the Wm5 namespace, a class Foo should use
    // "Wm5.Foo".  If an application has another namespace, SomeName, then
    // the name should be "SomeName.Foo".
    Rtti (const char* name, const Rtti* baseType);
    ~Rtti ();

    inline const char* GetName () const;
    inline bool IsExactly (const Rtti& type) const;
    bool IsDerived (const Rtti& type) const;

private:
    const char* mName;
    const Rtti* mBaseType;
};

#include "Wm5Rtti.inl"

}

//----------------------------------------------------------------------------
#define WM5_DECLARE_RTTI \
public: \
    static const Rtti TYPE; \
    \
    virtual const Rtti& GetRttiType () const \
    { \
        return TYPE; \
    }
//----------------------------------------------------------------------------
#define WM5_IMPLEMENT_RTTI(nsname, baseclassname, classname) \
    const Rtti classname::TYPE(#nsname"."#classname, &baseclassname::TYPE)
//----------------------------------------------------------------------------

#endif
cpp:
codice:
// Geometric Tools, LLC
// Copyright (c) 1998-2010
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/Licens...ICENSE_1_0.txt
//
// File Version: 5.0.0 (2010/01/01)

#include "Wm5CorePCH.h"
#include "Wm5Rtti.h"
using namespace Wm5;

//----------------------------------------------------------------------------
Rtti::Rtti (const char* name, const Rtti* baseType)
{
    mName = name;
    mBaseType = baseType;
}
//----------------------------------------------------------------------------
Rtti::~Rtti ()
{
}
//----------------------------------------------------------------------------
bool Rtti::IsDerived (const Rtti& type) const
{
    const Rtti* search = this;
    while (search)
    {
        if (search == &type)
        {
            return true;
        }
        search = search->mBaseType;
    }
    return false;
}
//----------------------------------------------------------------------------
e .inl
codice:
// Geometric Tools, LLC
// Copyright (c) 1998-2010
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/Licens...ICENSE_1_0.txt
//
// File Version: 5.0.0 (2010/01/01)

//----------------------------------------------------------------------------
inline const char* Rtti::GetName () const
{
    return mName;
}
//----------------------------------------------------------------------------
inline bool Rtti::IsExactly (const Rtti& type) const
{
    return (&type == this);
}
//----------------------------------------------------------------------------
perchè separa l'implementazione di alcuni membri in un file .inl con funzioni inline?
quando è meglio usare le funzioni inline?
grazie.