추상 클래스 (C++ 전용)

추상 클래스 는 특별히 기본 클래스로 사용되도록 설계된 클래스입니다. 추상 클래스에는 하나 이상의 순수 가상 함수가 포함되어 있습니다. 클래스 선언에서 가상 멤버 함수의 선언에 순수 지정자 (= 0) 를 사용하여 순수 가상 함수를 선언합니다.

다음은 추상 클래스의 예제입니다.
class AB {
public:
  virtual void f() = 0;
};
함수 AB::f 은 (는) 순수 가상 함수입니다. 함수 선언은 순수 지정자와 정의를 둘 다 가질 수 없습니다. 예를 들어, 컴파일러는 다음을 허용하지 않습니다.
struct A {
  virtual void g() { } = 0;
};
추상 클래스를 매개변수 유형, 함수 리턴 유형 또는 명시적 변환 유형으로 사용할 수 없으며 추상 클래스의 오브젝트를 선언할 수도 없습니다. 그러나 추상 클래스에 대한 포인터 및 참조를 선언할 수 있습니다. 다음 예는 이를 보여줍니다.
struct A {
  virtual void f() = 0;
};

struct B : A {
  virtual void f() { }
};

// Error:
// Class A is an abstract class
// A g();

// Error:
// Class A is an abstract class
// void h(A);
A& i(A&);

int main() {

// Error:
// Class A is an abstract class
//   A a;

   A* pa;
   B b;

// Error:
// Class A is an abstract class
//   static_cast<A>(b);
}
A 클래스는 추상 클래스입니다. 컴파일러는 함수 선언 A g() 또는 void h(A), 오브젝트 a의 선언 또는 유형 A에 대한 b 의 정적 캐스트를 허용하지 않습니다.

가상 구성원 함수가 상속됩니다. 파생된 클래스의 각 순수 가상 함수를 대체하지 않으면 추상 기본 클래스에서 파생된 클래스도 추상 클래스가 됩니다.

예를 들면, 다음과 같습니다.
class AB {
public:
  virtual void f() = 0;
};

class D2 : public AB {
  void g();
};

int main() {
  D2 d;
}
D2 이 (가) 추상 클래스이므로 컴파일러는 오브젝트 d 의 선언을 허용하지 않습니다. 이는 AB에서 순수 가상 함수 f() 을 (를) 상속했습니다. 컴파일러는 함수 D2::g()를 정의하는 경우 오브젝트 d 의 선언을 허용합니다.

비추상 클래스에서 추상 클래스를 파생할 수 있으며 비순수 가상 함수를 순수 가상 함수로 대체할 수 있습니다.

추상 클래스의 생성자 또는 소멸자에서 멤버 함수를 호출할 수 있습니다. 그러나 해당 생성자에서 순수 가상 함수를 직접 또는 간접적으로 호출한 결과는 정의되지 않습니다. 다음 예는 이를 보여줍니다.
struct A {
  A() {
    direct();
    indirect();
  }
  virtual void direct() = 0;
  virtual void indirect() { direct(); }
};
A 의 기본 생성자는 순수 가상 함수 direct() 를 직접 및 간접적으로 ( indirect()를 통해) 호출합니다.

컴파일러는 간접 호출이 아닌 순수 가상 함수에 대한 직접 호출에 대해 경고를 발행합니다.