-
Effective C++...30일지 2022. 7. 29. 08:39
public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자
public 상속의 is-a 관계
모든 사람은 학생이 아니지만 학생은 사람이다. 이 것의 관계가 public 상속이라고 할 수 있다.
이를 코드로 만들면 다음과 같다.
class Person {
...
void eat() { ... }
};
class Student : public Person {
...
void study() { ... }
};
사람의 일종인 학생은 사람이 할 수 있는 모든 것을 하지만 모든 사람이 공부하지는 않는다.
그런데 이러한 설계가 잘못되면 문제가 생길 수 있다.
모든 새는 난다고 가정해서 Bird 클래스에 fly 함수를 만들었다면 날지 못하는 새인 펭귄은 Bird를 상속받았을 때 fly 동작을 할 수 있게 될 것이다.
따라서 이 경우엔 새를 구분하는 Bird 클래스와 날 수 있는 새를 구분하는 FlyingBird 클래스를 구분해 다음과 같이 구현할 수 있을 것이다.
class Bird { ... };
class FlyingBird : public Bird {
...
void fly() { ... }
};
class Penguin : public Bird { ... };
다만 자신이 사용하려는 정보에 날아다닌다는 게 필요가 없다면 단순히 Bird 클래스와 Penguin 클래스로 구분하고 fly 함수를 구현하지 않을 수도 있다.
※ 제작하려는 소프트웨어 시스템이 기대하는 바에 따라 설계를 달리해야 한다.