【问题标题】:protected members are not accessible in derived classes在派生类中无法访问受保护的成员
【发布时间】:2024-11-27 14:20:02
【问题描述】:

为什么基类中的受保护成员在派生类中无法访问?

class ClassA
{
public:
    int publicmemberA;

protected:
    int protectedmemberA;

private:
    int privatememberA;

    ClassA();
};

class ClassB : public ClassA
{
};

int main ()
{
    ClassB b;
    b.protectedmemberA; // this says it is not accesible, violation?
    //.....
}

【问题讨论】:

    标签: c++ inheritance protected private-members


    【解决方案1】:

    因为受保护的成员仅在 B 类的范围内可见。因此您可以在此处访问它,例如:

    class ClassB : public ClassA
    {
        void foo() { std::cout << protectedMember;}
    };
    

    但是一个表达式,例如

    someInstance.someMember;
    

    要求someMember 公开。

    一些相关的SO问题herehere

    【讨论】:

    • tnx juan,有什么好的情况下首选受保护的修饰符?仍然无法理解它的意义:(
    • 我想不出使用受保护成员变量的充分理由。当您希望允许派生类使用某些基类功能而不公开该功能时,我已经看到了受保护函数的使用。我想说,只有当你真的知道自己在做什么时才使用它!
    【解决方案2】:

    您只能在B(或A)范围内访问protectedmemberA - 您正试图从main() 范围内访问它

    【讨论】:

      【解决方案3】:

      您可以访问protectedmemberA 内部 b。您正试图从外部访问它。它与继承无关。

      发生这种情况的原因与以下相同:

      class B
      {
      protected:
         int x;
      };
      
      //...
      
      B b;
      b.x = 0;  //also illegal
      

      【讨论】: