상속을 비공개로 설정하면 기본적으로 B가 A에서 상속한다는 사실조차도 외부 세계에 액세스하거나 볼 수없는 비공개라는 것입니다.
그것이 허용된다면 어떤 일이 일어날 지에 대한 장황한 논의를하지 않고, 단순한 사실은 그것이 허용되지 않는다는 것입니다. 파생 형식의 개체를 참조하기 위해 포인터를 기준으로 사용하려는 경우 공용 상속을 사용하는 데 거의 어려움이 있습니다.
개인 상속은 없습니다 반드시 (또는 보통)을 수행하도록 구성 Liskov 대체 원칙을 . 공용 상속은 파생 된 개체가 기본 클래스의 개체로 대체 될 수 있다고 주장하며 적절한 의미 체계 가 계속 생성됩니다. 그러나 개인 상속은 그것을 주장 하지 않습니다 . 개인 상속에 의해 암시되는 관계에 대한 일반적인 설명은 "다음으로 구현 됨"입니다.
공용 상속이란 파생 클래스가 기본 클래스의 모든 기능을 유지하고 잠재적으로 추가 기능을 추가한다는 것을 의미합니다. private 상속은 종종 그 반대를 의미합니다. 파생 클래스는 일반 기본 클래스를 사용하여 더 제한된 인터페이스로 무언가를 구현합니다.
예를 들어, C ++ 표준 라이브러리의 컨테이너가 템플릿이 아닌 상속을 사용하여 구현되었다고 가정 해 보겠습니다. 현재 시스템에서, std::deque
및 std::vector
용기이며, std::stack
보다 제한된 인터페이스를 제공하는 컨테이너 어댑터이다. 템플릿을 기반으로하기 때문에 또는에 std::stack
대한 어댑터로 사용할 수 있습니다 .std::deque
std::vector
본질적으로 동일한 상속을 제공하려면 개인 상속을 사용할 std::stack
것이므로 다음과 같습니다.
class stack : private vector {
};
이 경우, 우리는 확실히 않습니다 하지 사용자가 우리를 조작 할 수 있도록하려면 stack
그것 인 것처럼 vector
. 그렇게하면 스택의 기대치를 위반할 수 있습니다 (예 : 사용자가 의도 한대로 순전히 스택과 같은 방식이 아니라 중간에 항목을 삽입 / 제거 할 수 있음). 우리는 기본적으로 사용하고있는 vector
우리의 스택을 구현하는 편리한 방법으로하지만, (예를 들어) 우리의 구현 변경 한 경우 stack
또는 (NO 기본 클래스에 대한 의존도와) 독립을 측면에서 그것을 다시 구현 std::deque
, 우리는 할 수 없습니다 것을 원하는 클라이언트 코드에 영향을 미치기 위해 클라이언트 코드에 대해 이것은 특수한 다양한 벡터 (또는 데크)가 아닌 스택이어야합니다.
protected