Использование std::enable_shared_from_this

Почему при наследовании от enable_shared_from_this с модификатором private, следующий код приводит к выбросу исключения при вызове shared_from_this:

class A : std::enable_shared_from_this<A>
{
public:
    A(): std::enable_shared_from_this<A>()
    {

    }
    std::shared_ptr<A> getPtr()
    {
        return shared_from_this();
    }
};


 int main()
 {
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<A> a2 = a->getPtr();
 }

а если наследовать с модификатором public то все работает?


Ответы (1 шт):

Автор решения: AR Hovsepyan

Потому что: конструктор std::enable_shared_from_this защищенный, и, следовательно, конструировать его может только наследник. Закрытое наследование не делает целевой класс наследником. Целевой класс позволяет корректно создавать std::shared_ptr или weak_ptr с использованием указателя this, он должен являться(а не просто использовать) std::enable_shared_from_this(это есть требование), поэтому наследование должно быть открытым.

→ Ссылка