受保护的成员是否可以在非直接后代中访问?

时间:2012-12-20 21:26:46

标签: c++

根据http://en.cppreference.com/w/cpp/language/access

  

受保护的成员可以在类及其方法及其后代中访问

他们只是指直接后代,而不是后代的后代,还是指所有后代?

e.g。如果C类是B的子类,而B是A的子类,它有一个受保护的成员,那么B显然可以访问它,但是C呢?

4 个答案:

答案 0 :(得分:6)

受保护的成员可用于所有后代,直到/除非您达到使用私有继承的点。因此,只要您的A,B和C都使用公共继承(或受保护的继承,尽管这种情况很少被忽略),那么是的,最派生的仍然可以使用来自最基类的受保护成员(和如果有D,E和F,则仍然如此。

答案 1 :(得分:3)

所有后代。

另外,你应该自己尝试一下,在某个地方制作一个main.cpp并尝试一下。这就是你将学到的最多。

(当然,我假设你一直在使用公共派生,因为你没有另外指明)

祝你好运

答案 2 :(得分:1)

  

他们只是指直系后代吗?

不 - 后代的后代,后代的后代的后代等等也符合资格。他们都可以访问所有基类的受保护成员,一直到继承链。

class A {
protected:
    int val;
public:
    A(int x) : val(x) {}
};

struct B : public A {
    B(int x) : A(x) {}
};

struct C : public B {
    C(int x) : B(x) {}
    void show() {
        cout << val << endl;
    }
};

int main() {
    C c(123);
    c.show();
    return 0;
}

以上compiles and prints 123

答案 3 :(得分:1)

受保护的方法在第一个后代中是受保护的或私有的(取决于下载的继承方式)。从那里开始,他们的状态被确定为根据继承规则他们是该类的成员。

示例:

class A{
   protected: int var;
}

class B : private A{
}

class C : protected A{
}

class D : public A{
}

CD变量中var受到保护,B中的变量属于私有,并且不能被其他后代看到。