추상 클래스 (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()를 통해) 호출합니다.컴파일러는 간접 호출이 아닌 순수 가상 함수에 대한 직접 호출에 대해 경고를 발행합니다.