2011-01-25 7 views
0

AB의 두 클래스가있는 경우 B 개가 A입니다. 즉, A이 기본 클래스이고 B이 파생 클래스입니다.여기에 비공개 회원의 가치는 무엇입니까?

이제 A 클래스에는 private 명의 회원이 있다고 가정합니다. B 클래스가 상속 된 클래스 A 이래로, 개인 데이터 멤버는 클래스 B의 일부가되었습니다.

아시다시피 개인 멤버는 파생 클래스에서도 액세스 할 수 없다고하지만 파생 클래스에 있습니다. 이 경우 프라이버시의 가치는 무엇입니까?

감사합니다.

+1

예 영어는 코드보다 훨씬 더 (간결하게) 문제를 설명합니다. –

+0

기본 클래스의 개인 멤버에 액세스 할 수 있습니다. 컴파일러는 방지하지 않는 것에서 만 당신을 보호합니다. B b; ((A *) & B) -> any_private_member = 0; – 9dan

+0

@ 9dan : 실제로는 작동하지 않습니다. –

답변

3

B의 멤버 함수로는 사용할 수 없지만 A의 멤버 함수에 유용합니다. B이 차례로 사용됩니다. 이것은 캡슐화의 또 다른 레벨입니다 (BA의 기능이 어떻게 구현되는지 신경 쓰지 않아야합니다).

+0

왜 downvote? –

2

음, 클래스 A에 비공개이기 때문에, 클래스 A의 인스턴스가 뭔가 다른 것으로 사용한다고 가정합니다. 그렇지 않은 경우 제거 할 수 있습니다.

0

개인 회원입니다.

어디서 액세스하지 않았는지 어디에서 알 수 있습니까?

+0

사실인데, 파생 클래스는 (A 객체로 캐스팅하는 해킹이없이) 부모 클래스의 private 멤버에 액세스 할 수 없습니다 – Lacrymology

2

"개인"의 의도는 클래스 B를 작성하는 개발자에게이 멤버에 액세스하면 안된다는 것을 말합니다.

클래스 A의 개발자는 클래스 B의 개발자가 자신을 염려 할 필요가없는 특정 방식으로 멤버를 사용합니다.

1

B 개체의 A 멤버는 개체가 나타내는 개체를 나타내는 데 필요한 개체가됩니다. 클래스의 메소드는 아마도 그것들을 사용하기 때문에 아마도 A 클래스의 메소드를 호출 할 것입니다. A의 공용 (또는 보호 된) 인터페이스에 대해서만 신경 써야하며, 실제로 사용하십시오.

예 : A가 쓰기 및 읽기 메소드가있는 TCP/IP 프로토콜 소켓 구현이고 B가 A 위에 SSL 구현 일 수 있습니다. 암호화를 수행 할 수 있도록 (기본적으로) 읽기 및 쓰기를 다시 정의하고, 그리고 나서 A :: read와 A :: write를 사용하여 실제 쓰기 작업과 소켓 읽기 작업을 수행하십시오. 소켓 (또는 TCP 프로토콜 세부 사항)이이 디자인에 무엇인지 알 필요가 없으므로 A가이를 추상화하고 액세스 할 권한이 없습니다.

0

때문에 사용의 가장 간단한 종류의 시나리오를 상상해 믿거 나 말거나, 당신이 A의 구현 세부 사항에 부부 B 싶지 않아 : 이제

struct A 
{ 
protected: 
    int x; 
}; 

struct B 
{ 
    void f() { ... access x and use as input ... } 
}; 

을 변경한다고 가정 할 수 있습니다 귀하의 제품에 필요합니다 지금은 x 변수가 x 값을 가져 오지 않고 다른 방식으로 표현하기위한 x 값을 가져옵니다. B가 회원에게 직접 액세스하기 때문에 새로운 메커니즘이 없어도 x를 얻기 위해 작성한 B를 변경해야합니다. 더 많은 문제를위한 공간을 변경해야 할 필요가 있습니다.

대신 x를 개인 회원으로 설정하고 보호 된 게터를 제공하면이 문제가 발생하지 않습니다.

다시 말하면 이것은 가장 간단한 예입니다.일반적으로 x와 같은 값은 A의 동작을 구현하는 데 사용되며 B는 동작이 구현되는 방식에 관심을 두지 않아야합니다.

관련 문제