다음 쿼리가 있습니다.상속 및 우정 액세스. C++
classB inherits from classA
classC is friend of classB
이렇게하면 classC가 classA의 보호 된 멤버에 액세스 할 수 있어야합니까? classB는 classA에서 이것을 상속하므로 classC 클래스는 classB 클래스의 모든 것을 액세스 할 수 있습니까?
다음 쿼리가 있습니다.상속 및 우정 액세스. C++
classB inherits from classA
classC is friend of classB
이렇게하면 classC가 classA의 보호 된 멤버에 액세스 할 수 있어야합니까? classB는 classA에서 이것을 상속하므로 classC 클래스는 classB 클래스의 모든 것을 액세스 할 수 있습니까?
그것은 classC
이 classB
의 보호 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`
}
};
[내 원래 대답은 헛소리였습니다. 그 사과. 그 지적하고 더 나은 답을 제공하기 위해 @celtschk 주셔서 감사합니다.] C
이 B
의 친구입니다
경우, 민간, 공공, 또는 보호 여부, 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
};
그러나, 우정도 이적도 상속입니다 : 기본 하위 개체의 일부 접근 (공공 및 보호) 회원 C
이 B
의 친구입니다,하지만 A
의 (참고 1). 또한, D
경우 C
의 친구이며, 다음 D
'는 B
에의 우정을 준다 그래서 D
는 B
에 액세스 할 수 없습니다'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
의 친구도없는 경우 마찬가지로,
파생 클래스는 액세스 할 수 있습니다 각 기본 클래스의 공개 및 보호 된 모든 구성원에게 제공합니다.
클래스의 친구는 액세스 할 수있는 해당 클래스의 모든 회원 (즉, 비공개 기본 회원을 제외한 모든 회원)에 대한 액세스 권한을가집니다.
친구가 상속되지 않음 : 클래스에 친구가있는 경우 해당 우정은 해당 기본 클래스 나 파생 클래스에 적용되지 않습니다.
친구의 친구는 친구가 아닙니다.
원래 질문에 대한 대답이 더 좋습니다. –
@KerrekSB : 고맙습니다. – celtschk