[C++] 순수 가상 함수, 추상 클래스에 대하여

이 포스팅은 가상 함수에 대해 알고있다는 전제하에 작성되었습니다. 해당 내용을 모르시면 아래 링크되어 있는 글을 먼저 확인해주세요.

[C++] 가상함수(virtual) 사용법 총정리

 

순수 가상함수란?

순수 가상함수란 선언(declaration)만 있고 구현(definition)이 없는 가상 함수를 의미합니다.

virtual void func() = 0;

위와 같이 가상함수에 0을 대입하면 순수 가상함수가 됩니다. 순수 가상함수는 파생 클래스에서 재정의할 것으로 예상되는 함수에 대해 미리 호출 계획을 세워 두기 위해 정의합니다.

 

추상 클래스

위와 같은 순수 가상함수를 하나라도 가지고 있는 클래스를 추상클래스(abstract class)라고 합니다. 추상 클래스는 객체를 생성할 수 없습니다. 추상 클래스는 멤버 함수의 원형만을 정의하고 그 구현은 자식 클래스에서 하게됩니다. 추상 클래스를 상속받는 자식 클래스는 반드시 순수 가상함수를 오버라이딩 하여 재정의 해야만 합니다. 그렇지 않다면 아래 그림과 같이 컴파일 오류가 납니다.

추상 클래스 에러

이렇게 추상클래스를 활용하면 파생클래스에서 순수 가상함수를 재정의 하게끔 강제할 수 있습니다.

 

예제

#include <iostream>
using namespace std;

class Parent {
public :
    virtual void func() = 0; //순수 가상함수
};

class Child : public Parent {
public:
    void func() { //무조건 재정의를 해야만 함
        cout << "func" << endl;
    }
};

int main(void)
{
    Child c;
    c.func();
    
    return 0;
}

순수가상함수 예제1

위의 예제에서 Parent는 순수가상함수를 포함하므로 추상클래스가 됩니다. 추상클래스(Parent)는 객체를 생성할 수 없습니다. Parent p; 이런식으로 객체를 생성하게 된다면 아까 설명했듯 마찬가지로 아래와 같은 에러가 납니다.

순수가상함수 에러

또한 추상 클래스를 상속받은 클래스(Child)에서도 순수 가상함수들을 모두 다 재정의 해야만 객체를 생성할 수 있습니다.

댓글

Designed by JB FACTORY