본문 바로가기
번역/Bjarne Stroustrup's C++ Style and Technique FAQ

What is a pure virtual function?

by 겜게준 2019. 2. 27.

순수 가상 함수가 무엇인가요?

순수 가상 함수는 무조건 파생 클래스에서 오버라이드가 되어야 하는 함수이고 정의를 할 필요가 없습니다. 가상 함수는 특이한 "=0" 문법을 사용하여 순수 가상 함수로 선언됩니다. 예를 들면:


class Base {

public:

void f1(); // 가상 함수가 아닙

virtual void f2(); // 가상 함수이나 순수 가상 함수는 아님

virtual void f3() = 0; // 순수 가상 함수

};


Base b; // 에러: 순수 가상 함수 f3이 오버라이드 되지 않았습니다.


이쪽을 보면, Base는 추상 클래스이고 (순수 가상 함수가 있기 때문에), 그렇기 때문에 어떠한 Base 클래스의 오브젝트도 직접적으로 생성될 수 없습니다. Base는 (명시적으로) 기본 클래스의 역할을 하게 됩니다. 예를 들자면 :


class Derived : public Base {

// f1이/(가) 없음: 문제없음

// f2가 없음: 문제없음, Base::f2를 상속받음

void f3();

};


Derived d; // 문제없음: Derived::f3가 Base::f3를 오버라이드함


추상 클래스는 인터페이스를 정의할 때 굉장히 유용합니다. 사실상, 순수 가상 함수만 있는 클래스들은 가끔 인터페이스라고 불리기도 합니다. 순수 가상 함수를 정의할 수 있습니다.


Base::f3() { /* ... */ }


이 방식은 때때로 굉장히 유용하지만, 아직도 Base::f3()는 상속받는 파생 클래스에서 오버라이드 되어야 합니다. 만약에 파생 클래스에서 순수 가상 함수를 오버라이드를 하지 않았다면, 파생 클래스도 추상 클래스가 됩니다.


class D2 : public Base {

// f1이/(가) 없음: 문제 없음

// f2이/(가) 없음: 문제 없음, Base::f2를 상속받음

// f3이/(가) 없음: 문제 없음, 그러나 D2가 아직도 추상 클래스임

};


D2 d; // 에러: 순수 가상 함수 Base::f3가 오버라이드 되지 않음

댓글