我无法理解这个访问修饰符

I cant understand this access modifier

我是C++的初学者。我今天有一个编程测试。但我无法理解这个例子。

class A
{
public:
    int w;
};

class B : public A
{
public:
    int x;
};

class C : private A
{
public: int y;
};

class D : protected B
{
public: int z;
};

int main()
{
    D d;
    d.w = 10; // compile error
}

我认为(D d; d.w = 10)是正确的,但它有编译错误。

D 由 B 派生(受保护),B 由 A 派生(public)。 所以,我认为 D 可以访问 A class 成员,因为

Class乙:public甲 { public:int x} ==> Class乙 { public: int w;整数 x;}

and Class D : 保护 B { public: 整数 z} ==> classD {public: 整数 z;受保护:int w, int x;}

为什么我错了??谢谢!

D可以看到AB的成员,但是由于protected的继承,只有D和类派生自D 知道 DB 并且可以访问 BA 成员。 main 不是从 D 派生的,因此 main 不知道 DB 的继承,因此无法访问继承的 AB 名成员。