[C++] 상속

나장승현
|2024. 6. 2. 23:02

상속

  • 코드를 재사용하는 방법
  • 규모 확장
  • 관계의 한가지 유형

기본 문법

//class 파생클래스이름 : 접근제어지시자 부모클래스이름
class CMyData
{
};

class CMyDataEx : public CMyData
{
};

※ 자식 클래스 선언 시 자식 클래스의 생성자보다 부모 클래스의 생성자가 먼저 실행됨

참조 형식과 실 형식

class CMyData
{
public:
    CMyData()
    {
        cout << "CMyData()" << endl;
    }
    
    void TestFunc(void)
    {
        cout << "CMyData::TestFunc()" << endl;
    }
};

class CMyDataEx : public CMyData
{
public:
    CMyDataEx()
    {
        cout << "CMyDataEx()" << endl;
    }
    
    void TestFunc(void)
    {
        cout << "CMyDataEx::TestFunc()" << endl;
    }
};

//파생형식은 기본형식으로 pointing이 가능
int main() {
    CMyDataEx a;
    CMyData &b = a;
    b.TestFunc();
    return 0;
}
  • 일반 함수 - 참조 형식
  • 가상 함수 - 실 형식

생성자

  • 부모 클래스의 생성자가 자식 클래스의 생성자보다 먼저 실행되나 호출은 자식 클래스가 먼저 호출됨

※ 자식 클래스의 생성자에서 부모 클래스의 멤버 변수를 초기화 하게 되면 중복 발생

  • 자식 클래스에서 부모 클래스의 어떤 생성자를 호출할 지 선택 가능
class CMyData
{
public:
    CMyData()
    {
        cout << "CMyData()" << endl;
    }
    
    CMyData(int nParam)
    {
        cout << "CMyData(int)" << endl;
    }
    
    CMyData(double dParam)
    {
        cout << "CMyData(double)" << endl;
    }
    
};

class CMyDataEx : public CMyData
{
public:
    CMyDataEx() : CMyData()
    {
        cout << "CMyDataEx()" << endl;
    }

    CMyDataEx(int nParam) : CMyData(nParam)
    {
        cout << "CMyDataEx(int)" << endl;
    }
   
    CMyDataEx(double dParam) : CMyData(dParam)
    {
        cout << "CMyDataEx(double)" << endl;
    }
};
  • 생성자 상속
class CMyData
{
public:
    CMyData()
    {
        cout << "CMyData()" << endl;
    }
    
    CMyData(int nParam)
    {
        cout << "CMyData(int)" << endl;
    }
    
    CMyData(double dParam)
    {
        cout << "CMyData(double)" << endl;
    }
    
};

class CMyDataEx : public CMyData
{
public:
    using CMyData::CMyData;
};

가상 함수

  • 가상 함수는 미래를 호출하는 것 -> 현재 코드에서 미래에 재정의하는 것을 허용할 경우 사용
  • 과거에 만든 코드에서 가상 함수를 호출하고 현재에 가상 함수를 재정의 한다면, 현재 코드가 과거 코드에 의해서 호출됨 -> called by framework

소멸자

A *pdata = new B;
  • B가 A의 자식 클래스인 위와 같은 경우에, 인스턴스를 delete하면 참조 형식인 A의 소멸자가 호출됨
  • 만약 B의 생성자에서 메모리를 할당하는 코드가 있다면, 메모리 누수가 발생
  • 이를 방지하기 위해서 미래에 위와 같이 추상적으로 코드를 작성할 것으로 예상되면 A 클래스의 소멸자를 가상화 해야 함
  • 소멸자를 가상화 하게 되면 delete할 때, 실 형식인 B의 소멸자가 호출

순수 가상 함수

  • 선언은 있지만, 정의는 없는 가상 함수
  • 파생 클래스들이 이를 반드시 정의해야 함
  • 이를 바탕으로 다른 상호작용하는 클래스는 정해진 규격 정보를 얻는 것

'💻 Computer Science > C & C++' 카테고리의 다른 글

[C++] 템플릿  (1) 2024.06.04
[C++] 관계  (0) 2024.06.04
[C++] 연산자 다중 정의  (0) 2024.04.15
[C++] 생성자와 소멸자  (1) 2024.02.05
[C++] 네임스페이스  (0) 2024.02.05