본문 바로가기

C++ 기초 1

[C++] 5-3 순수 가상 함수 (Pure virtual function)

순수 가상 함수

   순수 가상 함수(pure virtual function)는 부모 클래스 내부에 본체에 정의하지 않는 가상 함수이다. 자식 클래스에서 오버라이드될 것이 확실한 멤버 함수들은 부모 클래스 내부의 순수가상함수를 이용한다. 순수가상함수의 선언 방법은 아래 예제에서 참고할 수 있다. 

   순수 가상 함수에 0 값을 설정한 것은 컴파일러에게 부모 클래스에 순수 가상 함수가 있다는 것을 알려주기 위한 것이다. 부모 클래스에서 가상 함수가 순수 가상 함수로 선언되면, 반드시 각 자식 클래스에서는 가상 함수가 오버라이드 되어야 한다. 만일 오버라이드 도지 않으면 오류가 발생한다.

   적어도 하나의 순수 가상 함수를 포함하고 있는 클래스를 추상 클래스(abstract class)라 한다. 추상 클래스를 사용해서는 어떠한 객체도 생성할 수 없다. 추상 클래스를 상속받은 자식 클래스에서 가상 함수를 오버라이드 해야만 자식 클래스를 이용해서 객체를 생성할 수 있다. 

 
예제
#include <iostream>
using namespace std;
class parent {
public:
	int a;
	parent(int x) {	//생성자
		a = x;
	}
	virtual void output() = 0;	//순수 가상 함수
};

class child1: public parent {
public:
	child1(int x) : parent(x) {}	//본체가 없는 생성자
	void output() {	//오버라이드
		cout << "a+a; " << a + a << endl;
	}
};

class child2 : public parent {
public:
	child2(int x) : parent(x) {}	//본체가 없는 생성자
	void output() {
		cout << "a+a= " << a + a << endl;	//오버라이드
	}
};

int main()
{
	parent* p;
	child1 ob_c1(10);
	child2 ob_c2(20);
	p = &ob_c1;
	p->output();
	p = &ob_c2;
	p->output();
	return 0;
}
실행 결과
a+a= 20
a+a= 40
  • 부모 클래스 parent의 멤버 함수 output()를 순수 가상 함수로 선언하였으므로 각 자식 클래스에서 output()가 오버라이드 되어야 한다. 
참고

1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13