상세 컨텐츠

본문 제목

C++ 순수 가상 함수

C++/C++98

by deulee 2023. 8. 7. 18:02

본문

기반 클래스가 가상 함수를 만드는 이유는 혹시라도 재정의하고 포인터로 호출할 때를 대비한 것이다.

 

즉, 가상 함수는 재정의해도 되는 함수이지 반드시 재정의해야 하는 함수는 아니다.

 

이에 비해 순수 가상 함수(Pure Virtual Function)는 파생 클래스에서 반드시 재정의해야 하는 함수이다.

 

이 함수는 일반적으로 함수의 동작을 정의하는 본체를 가지고 있지 않으며 따라서 이 상태에서는 호출할 수 없다. 본체가 없다는 뜻으로 함수 선언부의 끝에 "=0"를 표기를 하는데 이는 함수만 있고 코드는 비어 있다는 뜻이다.

 

#include <iostream>

class Shape
{
public:
	virtual void draw()=0; // 순수 가상 함수
	virtual ~Shape(){}
};

class Rect : public Shape
{
public:
	virtual void draw()
	{
		std::cout << "Rect Class" << std::endl;
	}
	virtual ~Rect(){}
};

class Circle : public Shape
{
public:
	virtual void draw()
	{
		std::cout << "Circle Class" << std::endl;
	}
	virtual ~Circle(){}
};

int main(void)
{
	Shape* pS[2];

	// Shape S; // 에러 발생
	pS[0] = new Rect;
	pS[1] = new Circle;

	for (int i = 0; i < 2; i++)
		pS[i]->draw();
	for (int i = 0; i < 2; i++)
		delete pS[i];
	return 0;
}

출력 결과는 각 동적 타입에 맞게 알맞는 가상 함수가 호출된다.

 

하지만 위에 보면 "Shape S;" 구문이 에러나 난다는 것을 알 수 있을 것이다.

 

하나 이상의 순수 가상 함수를 가지는 클래스추상 클래스(Abstract Class)라고 한다. 추상 클래스는 동작이 정의되지 않은 멤버 함수를 가지고 있기 때문에 이 상태로는 인스턴스를 생성할 수 없다.

 

이의 반대 개념은 구체 클래스(Concrete Class)인데 여태까지 우리가 만들었던 것을 의미한다.


추상 클래스 정의 이유

그럼 추상 클래스는 왜 정의하는 걸까?

 

추상 클래스는 구체 클래스의 공동의 조상이 되어 이 객체들의 집합을 관리하기 위해 필요하다.

 

추상 클래스는 객체는 생성할 수는 없지만 추상 클래스 타입의 포인터를 선언할 수는 있다.

Shape S; // 객체 생성 불가능
Shape* ptr; // 선언 가능

즉, "Circle"이나 "Rect" 클래스는 서로에게 서로를 정의할 수 없다. 즉, 이들을 뭉쳐줄 하나의 클래스가 필요한데 그것이 추상 클래스의 역할이 되는 것이다.

 

또한, 다형적인 함수의 집합을 정의하는 것이 추상 클래스의 다른 역할 중 하나이다.

 

도형이라 한다면 그리는 기능(Draw), 움직이는 기능(Move) 등등이 필요할 수도 있을 것이다.

 

즉, 추상 클래스에 순수 가상 함수를 미리 설정한다면 이 가상 함수를 반드시 재정의해야 한다는 의무가 생긴다.

 

만약 이 순수 가상 함수를 재정의하지 않는다면 파생 클래스도 인스턴스를 생성할 수 없다. 왜냐하면 순수 가상 함수가 물려져 파생 클래스도 추상 클래스가 되기 때문이다.

 

 

'C++ > C++98' 카테고리의 다른 글

C++ 클래스 템플릿  (0) 2023.08.08
C++ 함수 템플릿  (0) 2023.08.08
C++ 가상 파괴자  (0) 2023.08.07
C++ 가상 함수  (0) 2023.08.07
C++ [Has a] 관계  (0) 2023.08.07

관련글 더보기