在派生类中调用受保护的构造函数是不允许的,正如这里所解释的那样。
接受的答案解释了当基类A的对象是类B的子对象时,protected访问修饰符才会授予对A对象成员的访问权限。到目前为止没问题。
但是,为什么(至少在GCC 4.6.3)可以调用静态 protected 方法呢?特别是,下面的代码能编译通过,然而被注释的那行却不能:
接受的答案解释了当基类A的对象是类B的子对象时,protected访问修饰符才会授予对A对象成员的访问权限。到目前为止没问题。
但是,为什么(至少在GCC 4.6.3)可以调用静态 protected 方法呢?特别是,下面的代码能编译通过,然而被注释的那行却不能:
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
}
};
从哲学上讲,构造函数在很大程度上就像返回类 A
对象的静态方法,这就是为什么我不理解这里行为上的区别。
return A::A()
改成return A()
。虽然仍无法编译,但这次是由于protected
访问相关的原因,这使问题更加清晰。 - interjay