在派生类中无法访问受保护的成员

Posted

技术标签:

【中文标题】在派生类中无法访问受保护的成员【英文标题】:protected members are not accessible in derived classes 【发布时间】:2012-05-02 20:09:58 【问题描述】:

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

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?
    //.....

【问题讨论】:

【参考方案1】:

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

class ClassB : public ClassA

    void foo()  std::cout << protectedMember;
;

但是一个表达式,例如

someInstance.someMember;

要求someMember 公开。

一些相关的SO问题here和here。

【讨论】:

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

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

【讨论】:

【参考方案3】:

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

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

class B

protected:
   int x;
;

//...

B b;
b.x = 0;  //also illegal

【讨论】:

以上是关于在派生类中无法访问受保护的成员的主要内容,如果未能解决你的问题,请参考以下文章

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

无法访问派生类中的受保护方法

无法访问派生类中基类的受保护成员

访问派生类中的受保护成员

为啥我不能访问静态多态派生类中的受保护成员?

Java中的间接子类无法访问的超类中的受保护成员