순수 가상 함수(Pure Virtual Function)
순수 가상함수는 구현이 없는 가상함수
를 말합니다.
class Person
{
public:
virtual void VirtualMethod() = 0;
};
구현 대신 가상함수에 NULL (0)값을 대입하면 해당 함수는 순수 가상함수가 됩니다. 이와 동시에 순수 가상함수를 포함하는 클래스는 추상 클래스(Abstract Class)로 지정됩니다.
추상 클래스 (Abstract Class)
추상 클래스가 되면 인스턴스를 만들 수 없습니다. 이 클래스로부터 다른 자식 클래스를 파생시켜서 모든 순수 멤버 가상함수를 오버라이드 한 뒤, 해당 자식 클래스부터 인스턴스를 다시 생성할 수 있습니다.
즉, 추상 클래스는 '추상적인 형태'만 제안하고, 실제 구현은 자식 클래스로 미루기 위해 사용됩니다
.
class Person
{
public:
void DoAction()
{
std::cout << "Good Morning!" << std::endl;
Action();
std::cout << "Sleep.." << std::endl;
}
private:
virtual void Action() = 0;
};
class Student : public Person
{
private:
virtual void Action()
{
std::cout << "Study" << std::endl;
}
};
class Employee : public Person
{
private:
virtual void Action()
{
std::cout << "Work" << std::endl;
}
};
int main(int argc, char** argv)
{
Student student;
Employee employee;
student.DoAction();
std::cout << std::endl;
employee.DoAction();
}
Good Morning!
Study
Sleep..
Good Morning!
Work
Sleep..
위의 예제에서 Person은 Action이라는 순수 가상함수를 포함하는 추상클래스입니다.
멤버 함수인 DoAction은 일어나서 Action을 하고 잠에 든다로 동작을 확정했습니다.
즉, "어떠한 Action을 할 것인가"에 대한 문제는 자식으로 미뤄놓은 상태
입니다.
이를 쉽게 비유하면, 큰 명제에 몇개의 괄호를 비워놓은 것이라고 할 수 있습니다. 학생은 일어나서 [공부]를 하고 잠에 든다. 직원은 일어나서 [일]을 하고 잠에 든다.
큰 흐름은 부모 혹은 클래스 외부에 미리 설계되어 있는대로 따라가지만, 세부적인 사항은 자식 클래스에 위임하는 것입니다.
또한, 오직 추상적 설계만을 위해 디자인 된
모든 멤버 함수가 순수 가상함수인 클래스를 인터페이스(Interface)
라고 부르기도 합니다.