1

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

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

它们是指直系后代,而不是后代的后代,还是指所有后代?

例如,如果类 C 是 B 的子类,而 B 是具有受保护成员的 A 的子类,那么 B 显然可以访问它,但是 C 呢?

4

4 回答 4

6

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

于 2012-12-20T21:29:36.377 回答
3

所有的后代。

另外,有时您应该自己尝试一下,在某个地方创建一个 main.cpp 并尝试一下。这样你学得最多。

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

祝你好运

于 2012-12-20T21:29:41.260 回答
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;
}

以上编译并打印123

于 2012-12-20T21:28:45.677 回答
1

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

例子:

class A{
   protected: int var;
}

class B : private A{
}

class C : protected A{
}

class D : public A{
}

InCD变量var是受保护的,在B其私有中,不能被进一步的后代看到。

于 2012-12-20T21:29:47.413 回答