상속은 베이스 클래스의 인터페이스와 구현을 파생 클래스가 이어 받는 장치다. 맞을 때는 "파생은 베이스다"가 성립할 때다. 코드 재사용만을 위해 상속하면 관계가 거짓이 된다.

C++ 13. 상속은 무엇을 물려받는가의 핵심 흐름도
그림. 상속은 파생 객체가 베이스 계약을 지킬 때 사용한다.

공개 상속

class Piece {
public:
    virtual ~Piece() = default;
    virtual int value() const = 0;
};

class Chariot : public Piece {
public:
    int value() const override { return 130; }
};

`public` 상속은 ~이다(is-a) 관계다. `protected` 멤버는 파생 클래스에서는 보이지만 바깥에서는 보이지 않는다. 파생이 베이스의 불변식을 깨기 쉬우므로, protected 데이터보다 protected 함수를 선호한다.

잘림과 소멸

`Piece p = Chariot{};`는 `Piece` 부분만 복사하고 파생 부분을 버린다. 이것을 객체 잘림이라고 한다. `Piece&`나 `Piece*`로 보면 동적 타입이 유지된다.

베이스 포인터로 파생 객체를 `delete`할 수 있다면 베이스 소멸자는 가상이어야 한다. 가상이 아니면 파생 소멸자가 돌지 않아 자원이 샌다. 다형이 아니면 소멸자를 가상으로 만들 이유는 없다.