Каковы практические применения защищенного конструктора?
========================================================

Зачем кому-то объявлять конструктор защищенным? Я знаю, что конструкторы объявляются закрытыми, чтобы не допустить их создания в стеке.

 защищенный конструктор является абсолютно правильным. В этой ситуации вы не хотите, чтобы объекты создавались из класса, а использовали его только для наследования.

Существуют и другие случаи использования, например, когда определенный набор параметров конструкции должен быть ограничен производными классами.



 когда существуют требования к конструкции, которые не могут быть гарантированы только конструктором. Например, если метод инициализации должен быть вызван сразу после конструктора, или если объект должен зарегистрировать себя в каком-либо объекте контейнера / менеджера, это должно быть сделано вне конструктора. Ограничивая доступ к конструктору и предоставляя только фабричный метод, вы можете гарантировать, что любой экземпляр, который получает пользователь, будет выполнять все свои гарантии. Это также обычно используется для реализации Singleton, что на самом деле является еще одной гарантией, которую дает класс (что будет только один экземпляр).

Причина создания защищенного конструктора, а не частного, та же, что и для создания любого другого защищенного метода или поля вместо частного: чтобы он мог наследоваться дочерними элементами. Возможно, вам нужен открытый, не виртуальный фабричный метод в базовом классе, который возвращает ссылки на экземпляры производных классов; производные классы, очевидно, хотят получить доступ к родительским конструкторам, но вы все равно не хотите создавать их вне своей фабрики.



 которые могут его создать, например:

Единственный класс, который может создать его экземпляр, это класс LevelManager, поэтому вы всегда будете знать, что экземпляр Level создан в LevelManager.



 что только производные члены могут создавать экземпляры класса (и производные экземпляры), используя этот конструктор. Это звучит немного по-детски, но иногда полезно при реализации фабрик классов.



 который не должен быть доступен для экземпляра напрямую.



Это создает экземпляры класса и гарантирует, что каждый из них имеет уникальный инкрементный целочисленный идентификатор. Обратите внимание, что если конструктор, который вы хотите использовать, не является стандартным, вы также должны скрыть стандартный.



ования класса, если ни один из его методов не является чисто виртуальным.

Это не совсем абстрактно в смысле C ++, так как классы-друзья могут использовать его без переопределения, но тогда вам придется объявить их.