在派生类中调用一个受保护的构造是不允许的,因为解释在这里.
接受的答案解释了,只有当类的对象是类的子对象时,才protected
允许访问基类对象的成员.到现在为止还挺好.A
A
B
但是,为什么允许(至少在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
,这就是为什么我在这里没有得到行为差异的原因.
And*_*owl 10
但是,为什么允许(至少在GCC 4.6.3中)调用静态保护方法?
因为这就是标准所说的.适用于protected
成员可访问性的约束(以及您链接的答案解释得非常好)在C++ 11标准的第11.4/1节中定义,其第一句规定如下:
当非静态数据成员或非静态成员函数是其命名类的受保护成员时,将应用超出第11章中所述之外的其他访问检查(11.2).[...]
附加访问检查不适用于静态成员或静态成员函数.