在派生类中调用一个受保护的构造是不允许的,因为解释在这里.
接受的答案解释了,只有当类的对象是类的子对象时,才protected允许访问基类对象的成员.到现在为止还挺好.AAB
但是,为什么允许(至少在GCC 4.6.3中)调用静态保护方法?具体来说,以下编译对我来说没有任何意义,而注释行没有:
class A
{
protected:
A() {}
static A makeA() { return A(); }
};
class B: public A
{
public:
static A makeAFromB()
{
return makeA(); // compiles
// return A(); // does not compile
}
};
Run Code Online (Sandbox Code Playgroud)
从哲学上讲,构造函数非常类似于返回类对象的静态方法A,这就是为什么我在这里没有得到行为差异的原因.