C++:受保护的类构造函数

9

如果一个类总是会被继承,将构造函数设置为protected是否有意义?

class Base
{
protected:
    Base();
};

class Child : protected Base
{
public:
    Child() : Base();
};

感谢您。

顺便说一下,没有必要显式初始化“Base”。 - GManNickG
@GMan 这不是我正在做的准确示例。我只写了尽可能少的代码,同时仍然能够表达我的观点。 - user542687
2个回答

11
那只有在您不希望客户端创建Base实例的情况下才有意义,而是打算将其作为一些[派生]类的基类,并/或者打算让Base的友元使用(请参见下面的示例)。 请记住,受保护的函数(和构造函数)只能从派生类和friend类中调用。
class Sample;
class Base
{
    friend class Sample;
protected:
    Base() {}
};

class Sample
{
 public:
   Sample()
   {
      //invoking protected constructor
      Base *p = new Base();
   }
};

4

刚刚意识到一些类的正确修复方法是使用保护非虚析构函数,这些类在多态使用时却从未多态删除。我以前无法摆脱编译器警告建议使用虚拟析构函数,但这可能就是解决问题的方法。 - Ben Voigt
如果这很重要的话,目前我没有计划使用任何纯虚函数。 - user542687
1
@Jay:那么如果这个类除了作为一个基类以外没有被使用的意义,就用一个受保护的构造函数。 - GManNickG
@Jay:没问题。只是不要陷入混淆“它不应该在没有基础的情况下使用”和“我永远不会在没有基础的情况下使用它”的陷阱中;后者并不意味着前者。 - GManNickG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接