Figure 2: Shim class SGetSize implements GetSize functionality for derived classes

class ABase
{
protected:
    virtual size_t GetSize()=0;
    ...
    void UseGetSize()
    {
    ...
    size_t size = GetSize();
    ...
    }
};

template <class Derived, class Base>
class SGetSize : public Base
{
protected:
    virtual size_t GetSize() { return sizeof(Derived);}
};

class CDerivedOne : public SGetSize<CDerivedOne, ABase> {};
class CDerivedTwo: public SGetSize<CDerivedTwo, ABase> {};