Game Programming/자문자답

가상함수란 무엇인가?

Doanie 2022. 9. 11. 23:39

가상함수란 무엇인가?


가상 함수 (Virtual Function)

기본 클래스내에서 선언되어 상속한 클래스 내에서 같은 함수로 오버라이딩 될 수 있는 함수 또는 메소드.

포인터 또는 기본 클래스에 대한 참조를 사용하여 상속된 클래스의 객체를 참조하면 해당 객체에 대해 가상 함수를 호출하고 상속된 클래스의 함수를 실행할 수 있다.

class Enemy
{
	private:
  		int Index;
        
  	public:
  		virtual void Init();
}

class Zombie : public Enemy
{
	public:
  		virtual void Init() { index = 1; };
}

가상 함수 선언 규칙

1. 클래스의 public으로 선언되어있어야함.

2. 가상함수는 static, friend가 함수가 될 수 없음.

3. 실행 시간 다형성을 얻기 위해 기본 클래스의 포인터 또는 참조를 통해 접근해야함.

4. 반환형이나 매개변수는 기본 클래스와 동일해야함.

5. 클래스는 가상 소멸자를 가질 수 있지만 가상 생성자를 가질 수 없음.


가상 함수 테이블(Virtual Function Table)이란 무엇인가?

컴파일 시 가상 함수가 정의된 클래스가 메모리를 할당 하면 가상함수 포인터 배열이 클래스 최전방 메모리 영역에 잡힌다. 이 배열은 가상함수 주소들이 등록되고 가상함수테이블이라고 부르며 쉽게 vtable이라고 명칭한다.

부모 클래스 포인터 타입에 자식 포인터를 집어 넣으면 자식클래스의 가상함수테이블로 찾아간다.


가상 함수를 이용하면 코딩하는에 편리함은 있지만 프로그래밍에는 조금 느린편에 속한다. 그러므로 사전에 가상 함수를 미리 만드는 실수를 하지말고 꼭 필요한 경우에만 사용하는 권장한다!