private로 상속받으면 파생클래스 객체를 기본클래스 객체로 변환하지 않는다. 즉 다형성이 불가.
public, protected멤버도 모두 private가 된다. --> is-implemented-in-terms-of의 의미. 기본 클래스와의 개념적 관계가 있어서가 아니라 기능들을 가져와서 구현하는데 쓸 목적. 인터페이스를 받기 위함이 아니다.
소프트웨어 설계에서는 아무런 의미도 갖지 않으며, 단지 구현에서만 의미를 가질 뿐이다.
class A
{
public:
virtual void func();
}
B에서 A를 사용하고 싶을 때 다음과같이 사용 가능.
class B : private A
{
private:
vitual void func();
}
이때 클래스 B를 파생은 가능하게 하되, 파생 클래스에서 가상함수를 재정의 할 수 없게 만드려면(private로 만들어도 파생클래스에서 재정의는 가능하다) 다음과 같이 할수도 있다.
class B
{
private:
class Ba: public A {
public:
virtual void func() const;
...
};
Ba* ba;
...
};
이 방식의 또다른 장점은 B가 Ba 포인터만 가지고 있게 한다면 A.h를 include 하지 않아도 되기 때문에 컴파일 의존성이 낮아진다.
보통은 위 방식으로 하나 상속 방식이 필요한 경우가 있는데 기본 클래스의 protected멤버에 접근해야 하거나 상속받은 가상함수를 재정의 해야하는 경우이다.
추가적으로 기본클래스의 객체를 포함하지 않고, private 상속을 하면 기본클래스가 공백 클래스인 경우 객체로 포함할때 크기가 1로 책정되기 때문에 나타나는 문제를 해결할 수 있다.