상속은 베이스 클래스의 인터페이스와 구현을 파생 클래스가 이어 받는 장치다. 맞을 때는 "파생은 베이스다"가 성립할 때다. 코드 재사용만을 위해 상속하면 관계가 거짓이 된다.
공개 상속
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`할 수 있다면 베이스 소멸자는 가상이어야 한다. 가상이 아니면 파생 소멸자가 돌지 않아 자원이 샌다. 다형이 아니면 소멸자를 가상으로 만들 이유는 없다.
댓글
0개아직 댓글이 없습니다.