【问题标题】:C++: Protected Class ConstructorC++:受保护的类构造函数
【发布时间】:2011-05-30 06:54:25
【问题描述】:

如果一个类总是要被继承,那么构造函数protected是否有意义?

class Base
{
protected:
    Base();
};

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

谢谢。

【问题讨论】:

  • 顺便说一下,不需要显式初始化Base
  • @GMan 这不是我正在做的一个准确的例子。我只是尽可能少地编写代码,同时仍能表达我的观点。

标签: c++ inheritance polymorphism base-class


【解决方案1】:

这只有在您不希望客户创建 Base 的实例时才有意义,而是您希望它成为某些 [派生] 类的基类,和/或希望它被 @ 的朋友使用987654322@(见下面的例子)。请记住 protected 函数(和构造函数)只能从派生类和 friend 类中调用。

class Sample;
class Base
{
    friend class Sample;
protected:
    Base() {}
};

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

【讨论】:

    【解决方案2】:

    如果它总是作为基础(“mixin”),是的。请记住,具有纯虚函数的类始终是基类,但您不需要这样做,因为它无论如何都无法实例化。

    另外,给它a public virtual destructor or a protected non-virtual destructor

    【讨论】:

    • 刚刚意识到受保护的非虚拟析构函数将是我编写的某些类的正确修复,这些类以多态方式使用但从不以多态方式删除。我永远无法摆脱建议虚拟析构函数的编译器警告,但这可能只是这样做。
    • 如果这很重要,目前我不打算拥有任何纯虚函数。
    • @Jay:那么,如果将类用作除基之外的任何东西没有意义,请创建一个受保护的构造函数。
    • @Jay:没问题。只是不要陷入混淆“不作为基础不应该使用它”的陷阱。用“如果没有它作为基础,我永远不会使用它。”;后者不代表前者。
    猜你喜欢
    • 2012-06-04
    • 2018-06-15
    • 2014-08-29
    • 2016-04-07
    • 2012-12-07
    • 2010-11-08
    • 2011-10-23
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多