추상 클래스(C++)

추상 클래스는 보다 구체적인 클래스가 파생될 수 있는 일반 개념의 식 역할을 합니다. 추상 클래스 형식의 개체는 만들 수 없습니다. 그러나 포인터 및 참조를 사용하여 추상 클래스 형식을 사용할 수 있습니다.

하나 이상의 순수 가상 멤버 함수를 선언하여 추상 클래스를 만듭니다. 순수 지정자(= 0) 구문을 사용하여 선언된 가상 함수입니다. 추상 클래스에서 파생된 클래스는 순수 가상 함수를 구현해야 합니다. 이렇게 하지 않으면 파생된 클래스도 추상 클래스가 됩니다.

가상 함수에 제시된 예제를 생각해 보세요. Account 클래스의 용도는 일반적인 기능을 제공하는 것이지만, Account 형식의 개체는 너무 일반적이어서 유용하게 사용하기가 어렵습니다. 즉 Account , 추상 클래스에 적합한 후보입니다.

// deriv_AbstractClasses.cpp
// compile with: /LD
class Account {
public:
   Account( double d );   // Constructor.
   virtual double GetBalance();   // Obtain balance.
   virtual void PrintBalance() = 0;   // Pure virtual function.
private:
    double _balance;
};

이 선언과 이전 선언의 유일한 차이점은 PrintBalance가 순수 지정자(= 0)를 사용하여 선언되었다는 것입니다.

추상 클래스에 대한 제한

추상 클래스는 다음 용도로 사용할 수 없습니다.

  • 변수 또는 멤버 데이터

  • 인수 형식

  • 함수 반환 형식

  • 명시적 변환 형식

추상 클래스의 생성자가 직접 또는 간접적으로 순수 가상 함수를 호출하는 경우 결과는 정의되지 않습니다. 하지만 추상 클래스의 생성자 및 소멸자는 다른 멤버 함수를 호출할 수 있습니다.

정의된 순수 가상 함수

추상 클래스의 순수 가상 함수를 정의하거나 구현할 수 있습니다. 정규화된 구문을 사용하여 이러한 함수를 호출할 수 있습니다.

abstract-class-name::function-name()

정의된 순수 가상 함수는 기본 클래스에 순수 가상 소멸자가 포함된 클래스 계층 구조를 디자인할 때 유용합니다. 이는 개체를 파괴하는 동안 기본 클래스 소멸자가 항상 호출되기 때문입니다. 다음 예제를 참조하세요.

// deriv_RestrictionsOnUsingAbstractClasses.cpp
// Declare an abstract base class with a pure virtual destructor.
// It's the simplest possible abstract class.
class base
{
public:
    base() {}
    // To define the virtual destructor outside the class:
    virtual ~base() = 0;
    // Microsoft-specific extension to define it inline:
//  virtual ~base() = 0 {};
};

base::~base() {} // required if not using Microsoft extension

class derived : public base
{
public:
    derived() {}
    ~derived() {}
};

int main()
{
    derived aDerived; // destructor called when it goes out of scope
}

이 예제에서는 Microsoft 컴파일러 확장을 사용하여 순수 가상 ~base()에 인라인 정의를 추가하는 방법을 보여 줍니다. 를 사용하여 base::~base() {}클래스 외부에서 정의할 수도 있습니다.

개체 aDerived 가 범위를 벗어나면 클래스 derived 의 소멸자가 호출됩니다. 컴파일러는 소멸자 이후 derived 클래스 base 에 대한 소멸자를 암시적으로 호출하는 코드를 생성합니다. 순수 가상 함수에 대한 빈 구현은 함수 ~base 에 대해 적어도 일부 구현이 있는지 확인합니다. 이 오류가 없으면 링커는 암시적 호출에 대해 해결되지 않은 외부 기호 오류를 생성합니다.

참고 항목

앞의 예제에서 순수 가상 함수인 base::~basederived::~derived에서 암시적으로 호출됩니다. 정규화된 멤버 함수 이름을 사용하여 순수 가상 함수를 명시적으로 호출할 수도 있습니다. 이러한 함수에는 구현이 있어야 합니다. 또는 호출로 인해 링크 시 오류가 발생합니다.

참고 항목

상속