본문 바로가기

C++

순수 가상 함수(Pure Virtual Function)

- 선언만 있고 구현이 없는 가상 함수를 의미한다. 말 그대로 기초 클래스로서 의미만 가지고 있을 뿐

  구현부는 자신을 상속 받는 자식 클래스에서 구현할 수 있도록 하는 용도의 클래스이다.

- 순수 가상 함수를 하나라도 가지고 있는 클래스는 추상 클래스(Abstract Class)가 되며 객체화 할 수 없다.

- 추상 클래스를 상속 받는 자식 클래스에서 순수 가상 함수를 구현하지 않으면 해당 클래스도 추상화된다.

class AbstractClass
{
public:
    AbstractClass()  {}
    ~AbstractClass() {}

public:
    virtual void PureVirtualFunction() = 0; // 순수 가상 함수
};

class ChildClass : public AbstractClass
{
public:
    void PureVirtualFunction() override
    {
    	cout << "Pure Virtual Function" << endl;
    }
};

int main()
{
    AbstractClass* pAbsCls = new AbstractClass();
    return 0;
}

위 코드는 에러가 발생한다.

추상 클래스를 객체화할때 위와 같은 에러가 발생한다.

class AbstractClass
{
public:
    AbstractClass()  {}
    ~AbstractClass() {}

public:
    virtual void PureVirtualFunction() = 0;
};

class ChildClass : public AbstractClass
{
public:
	// 자식 클래스에서 순수 가상 함수를 구현하지 않았다.
};

int main()
{
    AbstractClass* pAbsCls = new AbstractClass();
    ChildClass* pAbsChild = new ChildClass();

    return 0;
}

위 코드는 에러가 발생한다.

자식 클래스에서 순수 가상 함수를 구현하지 않았다.

정상적으로 작동하는 코드

class AbstractClass
{
public:
    AbstractClass()  {}
    ~AbstractClass() {}

public:
    virtual void PureVirtualFunction() = 0;
};

class ChildClass : public AbstractClass
{
public:
    void PureVirtualFunction() override
    {
        cout << "Child Class PureVirtualFunction" << endl;
    }
};

int main()
{
    // 가능
    ChildClass* pAbsChild = new ChildClass();
    pAbsChild->PureVirtualFunction();  
    
    // AbstractClass를 객체화한건 아니다.
    AbstractClass* pAbsCls = new ChildClass();
    pAbsCls->PureVirtualFunction();    
    
    return 0;
}

결과 :

Child Class PureVirtualFunction

Child Class PureVirtualFunction


순수 가상 소멸자

- 뭔가..해당 클래스는 의미 또는 개념 클래스로만 의미를 두고싶지만.. 자식 클래스에서 반드시 구현할만한 가상 함수가

  존재하지 않을 경우에 소멸자에 순수 가상 함수를 부여하게 된다. 클래스 생성시 소멸자는 사용자가 정의하지 않으면

  기본 소멸자가 생성되며, 오버로딩이 없기 때문이다.

추상클래스 이미지화

종족(추상 클래스)는 단순하게 의미를 가지는 클래스이며 실제로 종족 클래스를 상속 받는 '인간', '오크', '엘프', '거인'

클래스에서 각 종족에 맞는 직업 및 능력치들을 함수 및 가상 함수로 정의하여 하위 클래스들을 구현하게 된다.

이 때 종족 클래스에 소멸자를 순수 가상 함수로 만들게 된다. (의미, 개념만을 가지는 클래스)

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

다중 상속(Diamond of Death)의 문제점  (0) 2019.07.10
상속을 사용하는 의미  (0) 2019.07.09
가상 함수 테이블(Virtual Function Table)  (0) 2019.07.09
객체지향이란?  (0) 2019.07.09
객체지향 - SOLID 개발 5대 원리  (0) 2019.07.09