MyData 클래스가 MyDataEx 클래스의 '기본 형식(부모 클래스)'이라면 MyData에 대한 포인터나 참조자로 MyDataEx 클래스 인스턴스를 참조할 수 있습니다.

MyData* pData = new MyDataEx;

 

참고로 위 코드처럼 '부모 클래스'로 '자식 클래스'를 참조할 때 '부모 클래스' 형식을 '추상 자료형'이라고 합니다. 그런데 이 '부모 클래스'를 이용해 동적 생성한 '자식 클래스'의 객체를 참조할 때 심각한 '메모리 누수(Memory Leak)' 문제가 발생할 수 있습니다.

// 부모 클래스
class MyData {
private:
    char* m_pszData;
    
public:
    MyData() { m_pszData = new char[32]; }
    
    ~MyData() { delete[] m_pszData; }
};

// 자식 클래스
class MyDataEx : public MyData {
private:
    int* m_pnData;
    
public:
    MyDataEx() { m_pnData = new int; }
    
    ~MyDataEx() { delete m_pnData; }
};

void main() {
    MyData* pData = new MyDataEx;
    
    delete pData; // '참조 형식'에 맞는 소멸자가 호출됩니다.
}

 

위와 같이 코드를 작성하면 '참조 형식'의 소멸자만 호출됩니다. 반면, 소멸자 앞에 'virtual' 예약어를 붙여 '가상 함수'로 만든다면 '참조 형식'의 소멸자와 더불어 '실 형식'의 소멸자도 호출되어 안전하게 자원을 해제할 수 있게 됩니다.