What are practical uses of a protected constructor?

77,076

Solution 1

When a class is (intended as) an abstract class, a protected constructor is exactly right. In that situation you don't want objects to be instantiated from the class but only use it to inherit from.

There are other uses cases, like when a certain set of construction parameters should be limited to derived classes.

Solution 2

Non-public constructors are useful when there are construction requirements that cannot be guaranteed solely by the constructor. For instance, if an initialization method needs to be called right after the constructor, or if the object needs to register itself with some container/manager object, this must be done outside the constructor. By limiting access to the constructor and providing only a factory method, you can ensure that any instance a user receives will fulfill all of its guarantees. This is also commonly used to implement a Singleton, which is really just another guarantee the class makes (that there will only be a single instance).

The reason for making the constructor protected, rather than private, is the same as for making any other method or field protected instead of private: so that it can be inherited by children. Perhaps you want a public, non-virtual factory method in the base class, which returns references to instances of the derived classes; the derived classes obviously want access to the parent constructors, but you still don't want to be creating them outside of your factory.

Solution 3

A protected constructor can be used to make a class effectively abstract when none of its methods are pure-virtual.

It is not quite abstract in the C++ sense since friend classes can still use it without overriding, but then you would have to declare these.

Solution 4

A protected constructor means that only derived members can construct instances of the class (and derived instances) using that constructor. This sounds a bit chicken-and-egg, but is sometimes useful when implementing class factories.

Solution 5

one use could be factory patterns

Share:
77,076

Related videos on Youtube

Amol Gawai
Author by

Amol Gawai

I am a mechanical/nuclear engineer and working in software development. I have been working in C++, C#, Python.

Updated on November 08, 2020

Comments

  • Amol Gawai
    Amol Gawai over 3 years

    Why would anyone declare a constructor protected? I know that constructors are declared private for the purpose of not allowing their creation on stack.

  • ralphtheninja
    ralphtheninja almost 15 years
    +1 But the doesn't necessarily have to be an abstract class. It's often the case though.
  • MSalters
    MSalters almost 15 years
    Technically, this applies only if ALL ctors are protected.
  • Amol Gawai
    Amol Gawai almost 15 years
    Isn't it sufficient to declare a function to be pure virtual for defining a base class? Or the above is in absence of pure virtual function. What is a creation event for a Derived class of such an Abstract class?
  • Admin
    Admin almost 15 years
    @Henk Holterman It certainly does - see Section 10.4 of the C++ Standard, entitled "Abstract Classes"
  • Henk Holterman
    Henk Holterman almost 15 years
    C++ only has an implicit concept of abstract class, based on the presence of abstract functions. If you have an architecturally abstract class w/o pure virtuals, there is no direct way of marking it abstract.
  • David
    David almost 15 years
    While true, that's a private constructor, not protected.
  • Admin
    Admin almost 15 years
    The presence of a PVF is "explicit", in any version of the English language I've ever come across.
  • Admin
    Admin almost 15 years
    So you want an unecessary "abstract" keyword? That's not the way C++ works. But it doesn't mean that there is no concept of an abstract class when the meaning of such a thing is EXPLICITLY described in the C++ standard itself!
  • Henk Holterman
    Henk Holterman almost 15 years
    Neil, I am not waging a language war here, just answered what protected ctor is good for. But you should be able to appreciate that there is a design-level concept of abstract class, and that it differs from the C++/Delphi definition.
  • JohnMcG
    JohnMcG almost 15 years
    The canonical way to indicate a class is abstract is to make the destructor pure virtual. But I tend to make the constructors protected as well, both for "belt and suspenders" protection, and to make it clear to clients they cannot directly instantiate an object of the class.
  • Amol Gawai
    Amol Gawai almost 15 years
    Combining with answers and comments, this answer is good for me to accept.
  • curryage
    curryage about 11 years
    If you want to make a class abstract without forcing anyone to override any specific method, you can make the destructor pure virtual.
  • Daniel Goldfarb
    Daniel Goldfarb over 10 years
    friend classes can also call the protected constructor (not just derived classes).
  • osirisgothra
    osirisgothra over 10 years
    ...and a use of a friend class calling the protected constructor would be in the case of an object that has members that are constant (set by the constructor) but need to be public, but never to be set by any other public access, guarantees that the object wont be created somewhere else and the data therefore would not be modified anywhere else either.
  • Pavan Manjunath
    Pavan Manjunath over 5 years
    It would be great if you can elaborate your answer by adding some practical examples.
  • renardesque
    renardesque almost 4 years
    You could also just not declare the default constructor and it wouldn't exist.