纯虚拟类中的构造函数应该是"受保护的"还是"公共的"?

Wiz*_*ann 9 c++ oop inheritance constructor pure-virtual

以下示例来自"Inside C++对象模型"一书

class Abstract_base {
public:
    virtual ~Abstract_base () = 0;
    virtual void interface () const = 0;
    virtual const char* mumble () const 
    {
        return _mumble;
    }
protected:
    char *_mumble;
};
Run Code Online (Sandbox Code Playgroud)

作者说如果我想初始化_mumble,那么应该实现纯虚基类的数据成员,一个"受保护的构造函数".

但为什么要保护?为什么"公共建设者"不适合这个班级?

谢谢你的回答,如果有一个例子,这将是完美的~~ :)

Fre*_*Foo 6

这并不重要,因为无论如何都不允许构造基类的对象.使它protected只是作为一个事实的提醒,该类应该是一个基类; 它只是化妆品/文件.

考虑

struct Base {
    virtual ~Base() = 0;
  protected:
    Base() { std::puts("Base constructor"); }
};

Base::~Base() { std::puts("Base destructor"); }

struct Derived : Base {};

int main()
{
    //Base b;   // compiler error
    Derived d;

    Base *b = new Derived();
    delete b;
}
Run Code Online (Sandbox Code Playgroud)

删除protected不会以任何方式改变程序的含义.

  • 因此,我想在析构函数之前不必写"public:". (4认同)

Fil*_*efp 5

抽象类和建筑等

构造函数是公共的还是受保护的并不重要,因为抽象类无法实例化.

您必须从中继承以便调用它的构造函数,并且由于Derived类调用抽象类的构造函数,因此只要Derived类可以访问它,您选择的保护级别无关紧要.


人们可能拥有它的一个原因protected是提醒人们必须通过继承来构造类,但老实说,当它看到它具有纯虚拟成员函数时应该足够清楚.


示例代码段

struct B {
  virtual void func () = 0;
  virtual ~B () = 0 { };
};

B::~B () { }
Run Code Online (Sandbox Code Playgroud)

struct D : B {
  void func () override;
};
Run Code Online (Sandbox Code Playgroud)

int main () {
  B b; // will error, no matter if Bs ctor is 'public' or 'protected'
       // due to pure virtual member-function

  D d; // legal, D has overriden `void B::func ()`
}
Run Code Online (Sandbox Code Playgroud)