抽象类中的公共构造函数是一个代码吗?

The*_*Man 12 c++

抽象类中的公共构造函数是一个代码吗?使构造函数受到保护可提供您可以使用的所有访问权限.使其公开的唯一附加访问权限是允许将类的实例声明为无法访问其受保护成员的范围中的变量,但是根本不能声明抽象类的实例.

Joh*_*itb 12

我已经在至少一个编码指南中读到它,抽象类的构造函数不应该公开 - 我认为这个规则对你给出的原因有意义.

但是,我无法想象将其公开会导致出错的情况.所以我不会说这是代码味道.我将受保护的构造函数视为"很高兴"属性:)

  • 同意,受保护的构造函数表明该类无法直接实例化,因此从程序员的角度来看它是一个"不错的属性",即使编译器并不真正关心它. (2认同)
  • 编码指南应该保护您免受可能发生的坏事.由于你无法实现一个抽象类,我不明白这个指南是什么保护你,因此感觉是任意的. (2认同)

qua*_*ana 4

我的观点是,公共构造函数可能会被视为令人困惑,正如您所说,使其受保护是正确的。我想说,受保护的构造函数正确地强化了这样的印象:抽象类的唯一合理用途是从它派生。

事实上,如果抽象类需要做一些事情,你只需要在它中声明一个构造函数,例如。初始化自己的私有成员。然后我希望还有其他对派生类有帮助的受保护成员函数。

编辑:

由于没有人发布任何代码,并且 @sbi 在对 OP 的评论中要求提供一些代码,我想我会发布一些代码:

class Base:
{
public:           // The question is: should the ctor be public or protected?
// protected:
    Base():i(0){} // ctor is necessary to initialise private member variable
public:
    virtual ~Base(){} // dtor is virtual (but thats another story)
                  // pure virtual method renders the whole class abstract
    virtual void setValue(void)=0;  
protected:
    int getValue(void){ return i;}
private:
    int i;
};

Base b1;  // Illegal since Base is abstract, even if ctor is public
Base& b2=makeBase();  //We can point to, or refer to a Base
b2.setValue();    // We're not sure what this does, but we can call it.
b2.getValue();    // Illegal since getValue is protected
Run Code Online (Sandbox Code Playgroud)