2013-11-28 4 views
10

공개 상속은 쉽습니다.보호 된 상속의 실제 사용은 무엇입니까?

A : 공용 B는 모든 A가 B라는 것을 의미합니다. vb.net 및 objective-c와 같은 대부분의 프로그래밍 언어에서 이것은 유일한 상속 유형입니다.

개인 상속은 쉽지만

무의미하다 : 개인 B가 A는 그러나 B.에 의해 구현되는 의미, 즉 A가 아닌 B를 포함해야 의미하기 때문에 그 무의미. 소유권은 불리하지 않고 결합력이 적다는 것을 의미합니다.

그런 다음 우리는 상속을 보호합니다.

누구든지 그게 무슨 뜻인지 설명 할 수 있습니까? 어떤 이는 그것이 "관계로서"라고 말합니다. 나는 아직도 그것에 대해 분명하지 않다.

실제 생산적 사용을 위해 보호 된 상속을 좋은 패턴 (양심)으로 사용하는 샘플 사례가있는 사람이 있습니까?

+0

내가 틀릴 수도 있지만, 나는 '절대적으로 (거의) 넌센스이고 (거의?) 절대 사용되지 않는다.'라는 황금 C++ 책 중 하나를 읽었을 것이라고 생각한다. '향후 사용을 위해 예약 됨'과 같습니다. 그러나, 다시, 나는 거짓말을 할지도 모른다 : Johannes Schaub의 –

+0

[this answer] (http://stackoverflow.com/a/1374362/2513200)는 실제로 사용 사례를 발견했다. 여전히 "매우 유용합니다." – Hulk

+0

또는 [이 하나] (http://stackoverflow.com/questions/374399/why-do-we-actually-need-private-or-protected-inheritance-in-c/374423#374423) – neutrino

답변

10

개인 상속은 쉽지만

무의미하다 : 개인 B가 A는 그러나 B.에 의해 구현되는 의미, 즉 A가 아닌 B를 포함해야 의미하기 때문에 그 무의미. 소유권은 불리하지 않고 결합력이 적다는 것을 의미합니다.

개인 상속 이유가 표시되지 않는다고해서 의미가 없다는 것을 의미하지는 않습니다. 개인 상속에 이유가있는 경우가 여러 가지 있습니다. 당신은 언뜻보기에 사적 상속이란 합병과 같은 관계를 의미하며, 사적 상속은 (약간) 결합이 더 가깝다는 것을 의미합니다.

  • 당신은뿐만 아니라 형식 정의를 상속 개인 상속 : aggretations을 통해 개인 상속을 선호위한

    이유는 다음의 몇 가지를 할 수 있습니다. 일부 경우 (예 : 특성 클래스) 개인적으로 상속하는 것은 기본 클래스의 typedef를 다시 typedef하는 대신에 사용할 수 있습니다.

  • 가끔 보다 먼저 회원을 초기화해야만 '실제'(즉 공개) 기본 클래스가됩니다. 이를 달성하는 유일한 방법은 해당 멤버를 공개 기지 이전에 상속 된 개인 기본 클래스로 만드는 것입니다.
  • 회원의 보호 된 회원에게 액세스해야하는 경우가 있습니다. 멤버 클래스 자체를 변경할 수 없으면 private 상속을 사용하여 액세스 권한을 얻어야합니다.
  • 구성원이 자신의 데이터 구성원이 없으면 여전히 공간을 차지합니다. 이것을 private 기본 클래스로 만들면 빈 기본 클래스 최적화가 가능해지며 클래스 객체의 크기가 줄어 듭니다.

아래 더 많은 포인트

  • , 야고보서의 의견은이 이유는 분명, 일부는 심지어 말 "해킹"수있는 기술적 인 이유가 있습니다. 그러나 그러한 이유가 존재하므로 사적 상속은 완전히 무의미하지 않습니다. "순수한 OO 스타일"이 아닙니다. C++은 순수 OO 언어가 아닙니다. 당신이 개인 상속에 대한 것을 이해하면

    보호 상속하는 이유는 매우 간단합니다 : 당신이 뭔가를 상속하는 이유가있는 경우

    개인적으로 은 (이러한 혜택을 만들고 싶어을 즉 회원-것이다 당신의 클래스 또는 typedef)에 액세스하려면 보호 된 상속을 사용하십시오. 분명히 사적 상속은 거의 사용되지 않아야하며 보호 된 상속은 더욱 그렇습니다.

  • +1

    스몰 토크 (Smalltalk)라는 원래의 상속이 C++의 공용보다 개인 상속에 더 가깝다는 것을 지적하는 것이 가치가 있습니다. 상속은 원래 공유 구현 _not_ 공유 인터페이스를 지원하도록 설계되었습니다. –

    +4

    물론 개인 상속의 가장 일반적인 이유가 무엇인지 놓쳤습니다. 기본 클래스는 템플릿 메서드 패턴을 사용하여 사용자 정의 가능한 구현을 제공하며 가상 함수를 재정의해야합니다. –

    +4

    가끔은 특정 인터페이스를 구현한다는 사실은 고객을위한 구현 세부 사항입니다. GUI 위젯이 GUI 이벤트 리스너라는 사실은 위젯 자체 (이벤트를 등록한 곳)에만 관련이 있습니다. –

    4

    보호 된 상속의 주된 동기는 직교성입니다. 다른 모든 문맥에서는 이 있습니다. 액세스 제어에는 private, protected 및 public 세 가지가 있습니다. 왜 상속은 다른해야합니까? 실제로는 이 필요하지 않거나 일반적으로 보호 된 액세스에 사용한다고 주장 할 수 있습니다. 이는 사례를 과장 할 수도 있지만 개인 또는 공개보다 훨씬 덜 보호됩니다.

    또한 개인 상속은 전혀 무의미하지 않으며 사실상 은 원래 상속 사용에 해당합니다. 구현을 수행하는 기본 클래스가 파생 클래스가 과부하되어야하는 가상 함수를 사용하자마자 포함을 사용할 수 없습니다.

    +1

    한때 보호 된 가상베이스를 사용하여 링커의 다양한 패스에 대한 명령 줄 인수를 관리했습니다. 각 패스는 자체 유형으로 처리되었으며 링커 유형은 각 패스 유형에서 개인적으로 파생되었습니다. 뒤늦은 지견이 좋은 디자인인지 아니면 과시하는지에 대해서는 확신하지 못합니다. –