[C] 객체지향적 C: 상속과 다형성
C는 기본적으로 상속을 지원하지 않기 때문에 구성을 통해서 상속을 흉내내야 한다.
일단 사람의 이름과 나이를 갖는 클래스 Person을 구현해보자.
베이스 클래스다.


그리고, Person에 더해 학교 정보를 갖는 클래스 Student를 구현해보자.
Person 객체를 내부적으로 소유하는 방식을 사용했다. 나는 정적객체로 했지만 동적할당으로 처리해도 된다.

그리고 super는 꼭 맨 위에 놔야한다.
구조체를 강제로 업캐스팅했을 때, 메모리의 배치순서로 접근을 시도하기 때문이다.
여튼 대충 이렇게 짜면

잘 동작은 한다.
근데 문제가 있다.
업캐스팅 시에 제대로된 다형적 동작을 보장하지 못한다는 것이다.


제대로된 OOP 언어에서는 저렇게 해도 Student의 print가 동작해야 한다.
어떻게 해야할까?
이제부터 코드가 좀 많이 복잡해진다.
런타임에 객체의 타입을 식별해야 하기 때문에 전용 열거자를 선언해서 Person에 포함시킨다.

match_print는 타입정보를 식별해서 student의 print를 호출할건지, person의 print를 호출할건지 선택하는 놈이다.
호출시 사용편의성을 위해 self 인자 타입을 void*로 해놨다.
Student는 거의 그대로다.
typeid만 Student로 잘 설정해준다.


그리고 중요한 매치 함수다. 메서드별로 다 설정해줘야하는게 귀찮긴 하다만..


여튼 돌리면 이제

다형적으로 잘 작동한다.
어떻게 되긴 하는데.. 아무래도 제대로된 oop 언어에 비해서는 매우 번거롭고 비효율적이다.
C에서는 이게 한계다.
맘에 안들면 C++을 쓰자