Это потому, что ваш родительский класс наследует enable_shared_from_this дважды.
Вместо этого вы должны наследовать его один раз - через SuperParent. И если вы хотите иметь возможность получить shared_ptr в классе Parent, вы также можете наследовать его от следующего вспомогательного класса:
template<class Derived>
class enable_shared_from_This
{
public:
typedef boost::shared_ptr<Derived> Ptr;
Ptr shared_from_This()
{
return boost::static_pointer_cast<Derived>(static_cast<Derived *>(this)->shared_from_this());
}
Ptr shared_from_This() const
{
return boost::static_pointer_cast<Derived>(static_cast<Derived *>(this)->shared_from_this());
}
};
Тогда
class Parent : public SuperParent, public enable_shared_from_This<Parent>