2012-04-05 3 views
7

다음 쿼리가 있습니다.상속 및 우정 액세스. C++

classB inherits from classA 
classC is friend of classB 

이렇게하면 classC가 classA의 보호 된 멤버에 액세스 할 수 있어야합니까? classB는 classA에서 이것을 상속하므로 classC 클래스는 classB 클래스의 모든 것을 액세스 할 수 있습니까?

답변

6

그것은 classCclassB의 보호 classA 하위 객체 부분에 액세스 할 수 있어야한다는 것을 의미한다. 아니요은 (는) classA에서 비공개로 액세스 할 수 있습니다. 예를 들어

:

class C; 

class A 
{ 
protected: 
    int i; 
}; 

class B: 
    public A 
{ 
    friend class C; 
}; 

class C 
{ 
public: 
    void foo(A& a, B& b) 
    { 
    // a.i = 3; // not allowed 
    b.i = 3; // allowed, accesses the `i` of the `A` subobject of `B` 
    } 
}; 
+0

원래 질문에 대한 대답이 더 좋습니다. –

+0

@KerrekSB : 고맙습니다. – celtschk

8

[내 원래 대답은 헛소리였습니다. 그 사과. 그 지적하고 더 나은 답을 제공하기 위해 @celtschk 주셔서 감사합니다.] CB의 친구입니다

경우, 민간, 공공, 또는 보호 여부, B의 모든 멤버에 액세스 할 수 있습니다, 그리고이 포함되어 있습니다

struct A { protected: int a; }; 
struct B : A { private: int b; friend struct C; } 

struct C 
{ 
    B x; 
    A w; 

    void f() 
    { 
     x.a = 1; // fine 
     x.b = 2; // fine 

     // w.a = 0; /* Error, #1 */ 
    } 

    friend struct D; // see below 
}; 

그러나, 우정도 이적도 상속입니다 : 기본 하위 개체의 일부 접근 (공공 및 보호) 회원 CB의 친구입니다,하지만 A의 (참고 1). 또한, D 경우 C의 친구이며, 다음 D '는 B에의 우정을 준다 그래서 DB에 액세스 할 수 없습니다'C이 접근 중 하나를하지 않는의 비공개 회원.

struct D 
{ 
    B y; 
    void g() 
    { 
     // y.b = 3; /* Error! */ 
    } 
}; 

struct E : C 
{ 
    B z; 
    void h() 
    { 
     // y.b = 4; /* Error! */ 
    } 
} 

는 아마도 하나는 몇 가지 점에서 무슨 일이 일어나고 있는지 요약 할 수 있습니다 : C에서 struct E : C 상속은 다음 E 자동 B의 친구도없는 경우 마찬가지로,

  • 파생 클래스는 액세스 할 수 있습니다 각 기본 클래스의 공개 및 보호 된 모든 구성원에게 제공합니다.

  • 클래스의 친구는 액세스 할 수있는 해당 클래스의 모든 회원 (즉, 비공개 기본 회원을 제외한 모든 회원)에 대한 액세스 권한을가집니다.

  • 친구가 상속되지 않음 : 클래스에 친구가있는 경우 해당 우정은 해당 기본 클래스 나 파생 클래스에 적용되지 않습니다.

  • 친구의 친구는 친구가 아닙니다.

+0

또한 B'의'A' 하위 개체'의 보호 된 멤버에 액세스 할 수 있습니다. 임의의 A 객체의 보호 된 멤버에 액세스 할 수 없습니다 (단, B는 할 수 없습니다). – celtschk

+0

@celtschk : 내 대답은 완전히 잘못되었다고 생각합니다. 나는 그것을 수정해야한다. –

+0

아직 완전히 정확하지 않습니다. 물론 'B' 자체에서 액세스 할 수있는'A' 하위 객체의 멤버 만 액세스 할 수 있습니다. 서면으로 말하면, 그것은 또한 A 회원의 사적인 회원들에게 접근 할 수 있어야한다. – celtschk