Я пишу класс, который должен выводиться из абстрактного базового класса. Я не могу изменить абстрактный базовый класс. Класс будет считаться shared_ptr
для абстрактного базового класса. Достаточно ли наследовать от абстрактного базового класса и enable_shared_from_this
? Вот так:
class IWidget {
public:
virtual ~IWidget(){}
// ...
};
class Widget : public std::enable_shared_from_this<Widget>, public IWidget {
protected:
Widget(); // protected, use create
public:
static std::shared_ptr<IWidget> create() {
return std::shared_ptr<IWidget>(new Widget(init));
}
// ...
};
Более полный код здесь, который, кажется, работает.
Большинство примеров, которые я могу найти в enable_shared_from_this
, имеют его в базовом классе. В этом случае я не могу изменить базовый класс. Можно ли использовать множественное наследование и использовать его в производном классе?
Меня немного беспокоило, что я могу только гарантировать, что enable_shared_from_this
будет работать, только если я создал shared_ptr<Widget>
, но в этом случае я создаю shared_ptr<IWidget>
.
Обновление: Интересно, что если я изменю метод create
на:
IWidget* w = new Widget(init);
return std::shared_ptr<IWidget>(w);
Я получаю ошибку во время выполнения, когда я пытаюсь использовать shared_from_this()
. Я думаю, это имеет смысл. shared_ptr
имеет шаблонный конструктор, который принимает "конвертируемый" указатель. И если конструктор shared_ptr
не знает, что он принимает Widget
, он не знает, что он происходит от enable_shared_from_this
, и он не может хранить weak_ptr
. Мне просто интересно, зарегистрировано ли это поведение.