티스토리 뷰
먼저 가상 함수에 대해 알아보자. 가상 함수는 포인터 변수의 자료형에 따라서 호출되는 함수의 종류가 달라지기 때문에 실제로 가리키는 객체에 있는 함수가 아닌 엉뚱한 함수를 호출하는 문제를 방지하기 위해 사용하는 개념이다. 윤성우의 열혈C++의 예제를 예로 들어보자.
‘정규직에는 사무직과 영업직이 있고, 영업직은 사무직과 똑같이 정해진 월 급여를 받지만, 거기에 추가로 판매실적에 대한 상여금을 받는다. 따라서 정규직은 영업직의 부모 클래스이고, 사무직은 특별한 점이 없기 때문에 따로 구분하지 않는다. 하지만 회사의 급여지급 프로그램에서는 일괄적으로 PermanentWorker클래스(정규직 클래스)의 GetPay함수를 사용하기 때문에 영업직의 판매 실적에 따른 상여금이 반영되지 않는다.’
이러한 문제를 해결하기 위해 가상 함수가 사용되었다. 부모 클래스의 함수 앞에 virtual을 써주면 그 자식 클래스들의 함수에도 (굳이 virtual을 쓰지 않더라도) 자동적으로 virtual 처리가 된다. (하지만 가상 처리가 된다는 것을 명시적으로 보여주기 위해 virtual을 써주는 것이 좋다.) 이렇게 하면 부모 클래스에서 함수를 불러와도 자식 클래스에서 오버라이딩을 한 함수가 자동적으로 호출되기 때문에 위 사례에서의 문제가 해결이 된다.
그렇다면 이러한 순수 가상 함수가 다중 상속에 안전한 이유는 무엇일까? 다시 위의 죽음의 다이아몬드를 참고해보자.
여기서 DigitalRecorder는 잊어버리자. CDBurner와 DVDBurner의 burn이라는 함수를 순수 가상함수로 선언한다면, CDBuerner와 DVDBuerner의 burn함수는 그저 명시적으로 가상함수의 역할만을 수행한다. 따라서 burn함수를 불러오면 헷갈릴 이유가 없어지는 것이다.
태클은 언제나 환영입니다. 잘못된 내용이 있다면 알려주세요!
'C++' 카테고리의 다른 글
(SFML) C++에서 SFML을 이용하여 2D(포트리스)게임 만들기 2차 (3) | 2018.07.26 |
---|---|
(SFML) C++에서 SFML을 이용하여 2D(포트리스)게임 만들기 1차 (0) | 2018.07.26 |
C++에서의 추상 클래스 (Abstract Class in C++) (0) | 2018.05.20 |
죽음의 다이아몬드 (the Deadly Diamond of Death) ::다중상속과 그 이야기 (0) | 2018.05.20 |
- Total
- Today
- Yesterday
- BFS
- 플로이드 와셜
- webOS
- 컨트리뷰톤
- BaekJoon
- 완전탐색
- Dynamic Programming
- 브루트포스
- 한화큐셀
- 프로그래머스
- 인공지능
- 코딩
- 파이썬
- 동적 계획법
- 카카오
- 백트래킹
- 1932
- 정렬
- LG
- 피보나치
- c
- 이분탐색
- 구현
- 오픈소스
- c++
- PyPy3
- 백준
- DFS
- 알고리즘
- DP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |