가상 함수(Virtual Function) / 순수 가상 함수(Pure Virtual Function)
(가상함수, 순수가상함수 둘다 반드시 상속 관계에서 시작한다.)
* 가상 함수: 컴파일러의 기준은 포인터 변수의 자료형을 기준으로 한다. 객체의 자료형에 따라 멤버 함수가 호출되게 하기 위해 virtual 키워드를 선언문에 붙여주고, 이 virtual 이 붙은 함수를 가상함수라 한다.
부모 클래스의 함수가 가상 함수이면 자식 클래스에서 오버라이딩한 함수도 자동으로 가상 함수로 정의 된다.(즉, 자식 클래스에서 virtual을 안써도 되지만 관례상 명시)
쉽게말해 virtual이 없으면 부모 함수가 호출되고 virtual이 있으면 자식 함수가 호출
* 순수 가상 함수: 함수의 선언만 있고 정의가 없는 virtual 키워드와 '= 0;' 이 붙은 함수.
이는 자식 클래스에서 반드시 오버라이딩 되어야 한다.(오버라이딩 하지 않으면 자식 클래스도 추상 클래스가 된다)
* 추상 클래스(abstract class): 순수 가상 함수를 포함하는 클래스. 추상 클래스는 객체를 만들 수 없다. 포인터로 선언할 수 있다.
* 추상 클래스의 존재 이유
부모 클래스:
자식 클래스: 개, 고양이, 늑대
개, 고양이, 늑대는 동물이라는 같은 특성으로 묶이지만 각각의 특성은 다르다. 울음소리의 경우 개-멍, 고양이-냥, 늑대-아올 로 울음소리가 다르기 때문에 부모 클래스에 울음소리라는 순수 가상 함수를 만들어 주면 자식 클래스에 속한 개, 고양이, 늑대는 각각의 울음 소리를 재정의(오버라이딩) 해야만 한다.
* 참고
인터페이스: 순수 가상 함수만으로 이루어진 클래스
예시) 부모클래스 weapon / 자식클래스 gun, bow
메인게임 헤더파일

메인게임 cpp파일

결과
case1. void attack() 부모클래스에 가상함수를 사용하지 않은 경우

case2. virtual void attack() 부모클래스에 가상함수를 사용한 경우

case3. virtual void attack() = 0; 부모클래스에 순수가상함수를 사용하고, 자식 클래스에 오버라이딩 하지 않은 경우


자식 클래스에 오버라이딩 하지 않아 컴파일 에러 발생
오버라이딩 한 경우 case2 와 같이 자식클래스 함수 호출
* 가상 함수: 컴파일러의 기준은 포인터 변수의 자료형을 기준으로 한다. 객체의 자료형에 따라 멤버 함수가 호출되게 하기 위해 virtual 키워드를 선언문에 붙여주고, 이 virtual 이 붙은 함수를 가상함수라 한다.
부모 클래스의 함수가 가상 함수이면 자식 클래스에서 오버라이딩한 함수도 자동으로 가상 함수로 정의 된다.(즉, 자식 클래스에서 virtual을 안써도 되지만 관례상 명시)
쉽게말해 virtual이 없으면 부모 함수가 호출되고 virtual이 있으면 자식 함수가 호출
* 순수 가상 함수: 함수의 선언만 있고 정의가 없는 virtual 키워드와 '= 0;' 이 붙은 함수.
이는 자식 클래스에서 반드시 오버라이딩 되어야 한다.(오버라이딩 하지 않으면 자식 클래스도 추상 클래스가 된다)
* 추상 클래스(abstract class): 순수 가상 함수를 포함하는 클래스. 추상 클래스는 객체를 만들 수 없다. 포인터로 선언할 수 있다.
* 추상 클래스의 존재 이유
부모 클래스:
자식 클래스: 개, 고양이, 늑대
개, 고양이, 늑대는 동물이라는 같은 특성으로 묶이지만 각각의 특성은 다르다. 울음소리의 경우 개-멍, 고양이-냥, 늑대-아올 로 울음소리가 다르기 때문에 부모 클래스에 울음소리라는 순수 가상 함수를 만들어 주면 자식 클래스에 속한 개, 고양이, 늑대는 각각의 울음 소리를 재정의(오버라이딩) 해야만 한다.
* 참고
인터페이스: 순수 가상 함수만으로 이루어진 클래스
예시) 부모클래스 weapon / 자식클래스 gun, bow
메인게임 헤더파일

메인게임 cpp파일

결과
case1. void attack() 부모클래스에 가상함수를 사용하지 않은 경우

case2. virtual void attack() 부모클래스에 가상함수를 사용한 경우

case3. virtual void attack() = 0; 부모클래스에 순수가상함수를 사용하고, 자식 클래스에 오버라이딩 하지 않은 경우


자식 클래스에 오버라이딩 하지 않아 컴파일 에러 발생
오버라이딩 한 경우 case2 와 같이 자식클래스 함수 호출
댓글
댓글 쓰기