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);
}

 

댓글

댓글을 사용할 수 없습니다.