受保护成员在派生类中不可访问。

6
为什么基类中受保护的成员在派生类中无法访问?
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?
    //.....
}
3个回答

10

您可以在b内部访问 protectedmemberA,但是您正在尝试从外部访问它。 这与继承无关。

这是与以下原因相同:

class B
{
protected:
   int x;
};

//...

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

3

由于受保护成员只在类B的作用域内可见,因此您可以在这里访问它,例如:

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

但是,像这样的表达式
someInstance.someMember;

需要someMember是公共的。

一些相关的SO问题在这里在这里


谢谢Juan。有什么好的情况适合使用protected修饰符吗?我仍然不能理解它的重要性 :( - vvavepacket
我想不出使用受保护的成员变量的好理由。当您希望允许派生类使用一些基类功能,而不将该功能公开时,可以使用受保护的函数。我会说,只有在您确实知道自己在做什么时才使用它! - juanchopanza

0
你只能在作用域 B(或 A)内访问 protectedmemberA,你正在试图从 main() 中访问它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接