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

为什么会有人声明一个构造函数被保护? 我知道构造函数被宣布为私有的,目的是不允许它们在堆栈上创build。

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

还有其他的用例,比如当一组构造参数应该被限制到派生类时。

一个用途可能是工厂模式

非公开构造函数在有构造函数无法保证的构造要求时非常有用。 例如,如果需要在构造函数之后立即调用初始化方法,或者如果对象需要使用某个容器/pipe理器对象进行注册,则必须在构造函数之外完成。 通过限制对构造函数的访问并仅提供工厂方法,可以确保用户收到的任何实例都能够完成所有的保证。 这也是通常用来实现一个单例,这实际上是类的另一个保证(只有一个实例)。

使构造函数受到保护而不是私有的原因与使其他方法或字段受保护而不是私有的原因相同,因此它可以被子项inheritance。 也许你想在基类中使用一个公共的,非虚拟的工厂方法,它返回对派生类实例的引用; 派生类显然需要访问父构造函数,但是你仍然不想在工厂之外创build它们。

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

一个被保护的构造函数可以被用来使一个类有效地抽象,当它的方法都不是纯虚的。

在C ++中,它并不是很抽象的,因为朋友类仍然可以使用它而不会覆盖,但是你必须声明它们。

让一个子类直接使用一个不应该被实例化器访问的构造器。

您可以使用它来限制可以创build它的类,例如:

class Level { private: Level(); ¨Level(); friend class LevelManager; }; 

唯一能够创build它的实例的类是LevelManager类,因此您将始终知道Level实例是在LevelManager中创build的。

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

 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; } }; 

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