IT공부/이것이 C++이다

객체의 관계 규정과 설계_1

doublehyun 2022. 3. 16. 00:44

Chapter.6 상속 기본

  • 상속이란?
    • 상속(Inheritance)
      • 객체 단위 코드를 '재사용'하는 방법, C++클래스가 C의 구조체와 구별되는 근거!
      • 두 클래스 사이의 '관계'를 고려해 프로그램 작성
    • 기본 문법
      • [class 파생클래스이름 : 접근제어지시자 부모클래스 이름]
        • ex) class MyData{ }; class MyDataEx : public CMyData { };
        • CMyDataEx 클래스는 CMyData 클래스를 상속받아 생성된 파생클래스가 된다, 
      • 파생 클래스 인스턴스가 생성될 때 기본 클래스(부모 클래스)의 생성자도 호출된다
        • 호출의 순서 1. 파생 클래스 생성자, 2. 부모 클래스 생성자
        • 실행의 순서 1. 부모 클래스 생성자, 2. 파생 클래스 생성자
      • 파생클래스는 기본클래스의 멤버에 접근 가능(private 제외)
      • 사용자 코드에서는 파생클래스의 인스턴스로 기본 클래스 메서드를 호출할 수 있다
    • 메서드 재정의
      • 오버라이드(override) 메서드를 재정의 하면 기존의 것이 무시된다(대체된다)
      • 기본 문법 및 특징
        • 재 정의시 기본형식의 메서드를 호출하려면 반드시 소속클래스를 정의해야 한다 (그렇지 않으면 재귀호출 발생함)
          • ex) CMyData::SetData(10);
        • 재정의 한 이유 : 제거 X, (기존 메서드 + 현재 메서드) 묶어 한꺼번에 작동 시키기 위함이다
        • 명시적 호출 : b.CMyData::SetData(15); // 메서드가 재 정의 되있어도 해당 클래스의 메서드가 실행된다
        • 묵시적 호출 : b.SetData(15);
          • 상위 클래스 참조자 형식으로 파생클래스에 대입했을 때 ( + 포인터도 )
          • ex) CMydata &rdata = a; // CMydata a;
          • rData.SetData(15); // CMyDataEx()의 SetData() 가 오버로드 됬으나 CMyData의 메서드가 실행됨
    • 상속에서의 생성자와 소멸자
      • 과정 
        1. 파생 클래스 생성자가 호출된다
        2. 파생 클래스 생성자가 실행되기 전에 부모 클래스의 생성자를 호출한다
        3. 부모 클래스 생성자가 실행되고 반환된다
        4. 파생 클래스의 생성자가 실행되고 반환된다
        5. 소멸은 생성의 역순(A -> B -> C | C -> B -> A)
          • 따라서 파생 클래스 에서 부모 클래스의 멤버변수에 쓰기, delet 연산을 하면 안된다!!!
          • 파생 클래스 생성자에서 부모 클래스 맴버 변수를 초기화 하지 않는다.
      • 생성자 선택
        • '생성자 상속'
          • 다중 정의된 상위 클래스의 생성자들을 그대로 가져오는 문법
            • ex)CMyDataEx(int nParam) : CMyData(nParam) { ~ } 
              • 파생 클래스 생성자 실행 전에 부모 클래스 생성자 호출함