访问指定为private的基类的公共静态成员

Kar*_*lEL 11 c++ oop derived-class static-members

我正在学习C++.docs.microsoft.com/en-us/cpp/cpp/member-access-control-cpp文档说:

将基类指定为私有时,它仅影响非静态成员.公共静态成员仍可在派生类中访问.

但是,以下代码从前一个引用之后的示例略微调整导致错误C2247:

'base :: y'无法访问,因为'Derived1'使用'private'继承'Base'.

对于这种情况,我将不胜感激.

class Base
{
public:
    int x;             
    static int y;      
};

class Derived1 : private Base
{
};

class Derived2 : public Derived1
{
public:
    int ShowCount();    
};

int Derived2::ShowCount()
{
    int cCount = Base::y;       
    return cCount;
}
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 16

该文档有点误导.

正确的编译器行为是Base::y Base::x双方在交通不便Derived,如果您使用的符号,以试图达到的static成员.

但是您可以通过使用另一个范围解析运算符通过全局命名空间(从而规避Derived1)访问它:

int Derived2::ShowCount()
{
    int cCount = ::Base::y;       
    return cCount;
}
Run Code Online (Sandbox Code Playgroud)

最后,如果您希望链接阶段成功,请不要忘记在某处定义 y.

  • 名称查找规则的路径查找有时非常令人沮丧. (4认同)