다형성의 문제점
- 부모 클래스 포인터 변수로 자식 클래스 객체의 주소를 받았을 때 포인터가 부모 클래스 타입이기 때문에, 부모 클래스의 기능만 접근이 가능하다.
해결 방안
- 가상 함수를 통해서 자식 클래스에서 오버라이딩 한 함수를 호출할 수 있게 한다.
가상 함수(Virtual)의 작동 원리
- 부모 클래스에 가상 함수(virtaul 함수)가 1개 이상 존재하면 각 클래스(부모, 자식)는 타입 정보가 만들어진다.
- 클래스에 대한 타입 정보는 메모리에 하나만 생성이 되고 이 타입 정보에는 해당 클래스가 보유하고 있는 가상 함수의 주소를 모아놓은 '가상 함수 테이블'이 있다.
- '가상 함수 테이블'에 virtual이 붙은 함수가 등록이 된다.
- 부모 클래스에 보이지 않는 멤버(가상 함수 테이블 포인터)가 추가된다.
- 가상 함수 테이블 포인터는 타입 정보를 가리키는데 같은 클래스의 여러 변수를 만들면 이 변수들의 '가상 함수 테이블 포인터'는 같은 타입 정보를 가리킨다. (메모리에 하나만 존재하므로)
- 가상 함수를 호출할 경우, 부모 클래스의 멤버인 '가상 함수 테이블 포인터'를 이용해서 '가상 함수 테이블'로 접근하여 등록이 되어있는 함수를 호출한다. (이 때 호출은 인덱싱으로 이루어짐)
'개발 > C++' 카테고리의 다른 글
[C++] 범위기반 for문 (0) | 2024.02.28 |
---|