Java에서는 '추상 메서드'를 가진 클래스를 '추상 클래스'라고 말합니다. 용어만 다를뿐 C++도 같은 맥락입니다. C++에서는 '순수 가상 함수'를 가진 클래스를 '추상 클래스'라고 말합니다. 그렇다면 '순수 가상 함수'란 무엇일까요?

 

'순수 가상 함수'란 선언은 지금하되 정의는 '자식 클래스'에 위임하는 함수입니다. '가상 함수' 선언 끝부분에 '=0'이라는 표기가 붙습니다.

virtual int GetData() const = 0;

 

'추상 클래스'의 장점은 자신을 상속 받을 여러 '자식 클래스'들의 인터페이스를 통일시켜줄 수가 있다는 것입니다.

// 초기 제작자의 코드
class MyObject {
protected:
    int m_nDeviceID;
    
public:
    MyObject() { /* do somthing */ }
    
    virtual ~MyObject() { /* do somthing */ }
    
    virtual int GetDeviceID() = 0; // '순수 가상 함수'를 선언합니다.
};

// 초기 제작자가 만든 함수
void PrintID(MyObject* obj) {
    cout << "DeviceID: " &t;< obj->GetDeviceID() << endl;
}

// 후기 제작자의 코드
class MyTV : public MyObject {
public:
    MyTV(int nID) { m_nDeviceID = nID; }
    
    virtual int GetDeviceID() { return m_nDeviceID; }
};

class MyPhone : public MyObject {
public:
    MyPhone(int nID) { m_nDeviceID = nID; }
    
    virtual int GetDeviceID() { return m_nDeviceID;
};

// 사용자 코드
void main() {
    MyTV a{ 10 };
    MyPhone b{ 20 };
    
    // '자식 클래스'들의 인터페이스를 통일시켰기 때문에 어떤 인스턴스든 넣을 수 있습니다.
    // 이게 가능한 이유는 '부모 클래스' 참조자는 '자식 클래스' 객체를 참조할 수 있기 때문입니다.
    // 그리고 '가상 함수'는 '실 형식'에서 재정의된 것이 호출되기 때문입니다.
    ::PrintID(&a);
    ::PrintID(&b);
}