게임 개발/C++

[C++] 오버라이딩 - 3. 순수 가상 함수

유행성바코드 2025. 2. 26. 22:20

목차

  • 01. Intro
  • 02. 가상 함수 호출 과정 복습
  • 03. 순수 가상 함수
    • 정의 및 형태
    • 특징
    • 추상 클래스
  • 03. 마무리
  • 04. 연관 내용

01. Intro

지난 시간에 동적 오버라이딩인 가상 함수를 적용했을 때, 어떤 과정으로 동작하는지 가상 함수 테이블과 포인터로 알아봤습니다. 이번에는 가상 함수이지만, 조금 다른 순수 가상 함수와 추상 클래스에 대해서 알아보겠습니다.

 


02. 가상 함수 호출 과정 복습

순수 가상 함수를 알아보기 전에 지난 시간에 알아봤던 가상 함수 호출 과정에 대해서 복습하겠습니다.

 

1. vptr은 해당 객체의 클래스에 맞는 vtable의 주소를 가리키고 있습니다.

2. 객체가 가상 함수를 호출하면, vptr을 통해 vtable을 찾습니다.

3. vtable에서 해당 가상 함수의 주소를 가지고 와서 실행합니다.

 


 

03. 순수 가상 함수

 

정의 및 형태

순수 가상 함수는 선언만 하고 구현이 없는 함수를 의미합니다.

따라서, 선언된 함수만 자식 클래스로 전달하는 용도로 사용됩니다.

 

순수 가상 함수의 형태는 아래 코드와 같습니다.

#include <iostream>

using namespace std;

class Sport
{
public:
	// 순수 가상 함수 선언
	virtual void Play() = 0;
};

가상 함수 선언 뒤에 구현부가 없고 = 0으로 표기되어 있습니다.

이를 순수 가상 함수라고 합니다.

 

 

특징

 

자식 클래스에서 구현 

순수 가상 함수의 특징은 구현에 대한 책임을 자식 클래스에게 넘기는 것입니다.

따라서, 순수 가상 함수가 있는 부모 클래스를 상속받은 자식 클래스는 반드시 순수 가상 함수의 구현부를 작성해야 합니다.

#include <iostream>

using namespace std;

class Sport
{
public:
	virtual void Play() = 0;
};

class Soccer : public Sport
{
public:
	
};

int main()
{
	Soccer* soccer = new Soccer();
}

만약에 자식 클래스에서 순수 가상 함수인 Play()에 대해 구현하지 않고 객체를 할당하려면, 아래와 같은 오류가 뜹니다.

해석하자면, 순수 가상 함수인 Sport::Play()에 대한 오버라이딩을 하지 않아서 사용할 수 없다고 합니다.

 

#include <iostream>

using namespace std;

class Sport
{
public:
	virtual void Play() = 0;
};

class Soccer : public Sport
{
public:
	virtual void Play()
	{
		cout << "Soccer Game Play" << endl;
	}
};

int main()
{
	Soccer* soccer = new Soccer();

	return 0;
}

위 코드처럼 Soccer 클래스에서 Play() 함수에 대한 구현부를 작성하면, 더 이상 오류가 나타나지 않습니다.

 

 

순수 가상 함수가 있는 클래스에 대한 객체 생성 불가

순수 가상 함수가 있는 클래스는 객체 생성을 할 수 없습니다.

#include <iostream>

using namespace std;

class Sport
{
public:
	virtual void Play() = 0;
};

class Soccer : public Sport
{
public:
	virtual void Play()
	{
		cout << "Soccer Game Play" << endl;
	}
};

int main()
{
	Sport* sport = new Sport();

	return 0;
}

위 코드처럼 순수 가상 함수가 있는 Sport 클래스에 대한 객체를 생성할 때, 아래와 같은 오류가 나타납니다.

 

 

 

추상 클래스 

이러한 결과를 볼 때, 순수 가상 함수가 있는 클래스는 추상 클래스(Abstract Class)라고 볼 수 있습니다.

 

그래서 정리하자면, 아래와 같습니다.

 

1. 순수 가상 함수가 하나라도 있으면, 해당 클래스는 추상 클래스가 됩니다.

2. 추상 클래스를 상속받은 클래스는 반드시 순수 가상 함수에 대해서 구현해야 합니다.

3. 추상 클래스는 객체를 생성할 수 없습니다.

 

 


04. 마무리

이번 포스팅까지 해서 오버라이딩에 대한 내용을 마치도록 하겠습니다. 

 


05. 연관 내용

  • [C++] 오버라이딩 - 1. 정적 & 동적
 

[C++] 오버라이딩 - 1. 정적 & 동적

목차01. Intro02. 오버라이딩정적 오버라이딩동적 오버라이딩03. 마무리04. 연관 내용01. Intro오늘은 클래스를 상속받았을 때, 사용할 수 있는 함수 오버라이딩에 대해 알아보겠습니다. 02. 오버라이

epidemic-barcode.tistory.com

  • [C++] 오버라이딩 - 2. 가상 함수 테이블 & 포인터   
 

[C++] 오버라이딩 - 2. 가상 함수 테이블 & 포인터

목차01. Intro02. 가상 함수가상 함수 테이블 포인터가상 함수 테이블 03. 마무리04. 연관 내용01. Intro지난 시간에 오버라이딩 종류인 [정적 오버라이딩]과 [동적 오버라이딩]에 대해서 알아봤습니다

epidemic-barcode.tistory.com

 

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!