受保护的构造函数的实际用途是什么?

Amo*_*wai 78 c++ constructor protected

为什么有人声明构造函数受到保护?我知道构造函数被声明为私有,目的是不允许在堆栈上创建它们.

Hen*_*man 100

当一个类(作为一个抽象类)时,受保护的构造函数是完全正确的.在这种情况下,您不希望从类中实例化对象,而只是使用它来继承.

还有其他用例,例如某些构造参数应限制为派生类.

  • +1但不一定是抽象类.但情况往往如此. (8认同)
  • 表示类是抽象的规范方法是使析构函数纯粹虚拟.但是我倾向于使构造函数也受到保护,无论是对于"腰带和吊带"的保护,并且向客户说明他们不能直接实例化该类的对象. (8认同)
  • 尼尔,我不是在这里发动语言大战,只是回答了保护ctor的好处.但是你应该能够理解抽象类的设计级概念,它与C++/Delphi定义不同. (6认同)
  • 将函数声明为纯虚拟用于定义基类是不够的?或者上面没有纯虚函数.这样一个Abstract类的Derived类的创建事件是什么? (4认同)
  • 结合答案和评论,这个答案对我来说是好的. (2认同)

Nic*_*wis 9

当构造要求无法单独由构造函数保证时,非公共构造函数非常有用.例如,如果需要在构造函数之后立即调用初始化方法,或者如果对象需要使用某个容器/管理器对象注册自身,则必须在构造函数外部执行此操作.通过限制对构造函数的访问并仅提供工厂方法,您可以确保用户收到的任何实例都将满足其所有保证.这通常也用于实现Singleton,这实际上只是该类所做的另一个保证(只有一个实例).

使构造函数受保护而不是私有的原因与使任何其他方法或字段受保护而不是私有相同:因此它可以由子项继承.也许你想在基类中使用一个公共的非虚拟工厂方法,它返回对派生类实例的引用; 派生类显然希望访问父构造函数,但您仍然不希望在工厂外创建它们.


Uma*_*med 8

一种用途可能是工厂模式

  • 如果您可以通过添加一些实际示例来详细说明答案,那就太好了。 (4认同)

小智 7

当一个类的方法都不是纯虚方法时,可以使用受保护的构造函数使类有效地抽象化.

它在C++意义上并不是很抽象,因为朋友类仍然可以在不重写的情况下使用它,但是你必须声明它们.


小智 6

受保护的构造函数意味着只有派生成员才能使用该构造函数构造类(和派生实例)的实例.这听起来有点鸡蛋和鸡蛋,但在实施类工厂时有时很有用.

  • 从技术上讲,这仅适用于所有ctors受到保护的情况. (3认同)
  • 朋友类也可以调用受保护的构造函数(而不仅仅是派生类)。 (2认同)

sea*_*ley 6

对于具有副作用的工厂方法。

class mine {

  private:
    mine () {};

  protected:
    mine(int id) : m_id(id) {};

   int m_id;
   static int m_count;

  public:
    static mine* CreateOneOfMe() {
         return mine(m_count++);
    }

    int GetId() { return m_id; }

 };
Run Code Online (Sandbox Code Playgroud)

这将创建该类的实例,并确保每个实例都有一个唯一的递增整数id。请注意,如果您要使用的构造函数不是默认构造函数,则也必须隐藏默认构造函数。


Oli*_*ppi 5

让子类使用实例化器不能直接访问的构造函数。