Box 클래스를 상속받아 Carton 클래스를 만들 것이다. 데이터 멤버는 protected로 되어 있고, 소멸자는 virtual로 지정되어 있다. 반드시 이렇게 해야 하는 건 아니지만, 기반 클래스의 소멸자를 virtual로 선언하는 것은 좋은 습관이다. 이렇게 선언해두면 오버헤드를 최소화할 수 있고, 파생 클래스에서 잘못된 소멸자를 호출하는 걸 예방할 수 있다. volume() 멤버와 스트림 입출력을 수행하는 read()와 write() 멤버는 virtual로 선언되어 있으니 상속받은 클래스에서는 필요할 때 이들 멤버를 재정의하면 된다.
volume() 함수는 Box.h에 inline으로 정의할 수 있다.
inline double Box::volume() const { return length*width*height; }
비교 함수도 inline으로 정의할 수 있다.
// < 연산자 inline bool Box::operator<(const Box& box) const { return volume() < box.volume(); } // 상등관계(equality) 비교 연산자 inline bool Box::operator==(const Box& box) const { return length == box.length && width == box.width && height == box.height; }