순수 가상 함수
순수 가상 함수(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
'C++ 기초 1' 카테고리의 다른 글
[C++] 5-5 템플릿 클래스(Template class) (0) | 2024.01.03 |
---|---|
[C++] 5-4 템플릿 함수 (Template function) (1) | 2024.01.02 |
[C++] 5-2 가상 함수(Virtual function) (1) | 2023.12.28 |
[C++] 5-1 기본 클래스 포인터 (Base class pointer) (1) | 2023.12.27 |
[C++] 4-5 가상 기본 클래스 (Virtual base class) (0) | 2023.12.26 |