상속과 생성자 호출 순서

보물창고·2022년 8월 30일
0

강의 내용

  1. 파생 클래스 생성 시 기반 클래스의 생성자가 먼저 호출됨.
  2. 기반 클래스의 생성자는 따로 명시하지 않으면 디폴트 생성자가 호출됨.
    파생의 생성자에서 인자있는 생성자 명시할 경우(변환 생성자라고 함.), 해당 생성자를 호출함.
  3. 기반 클래스의 디폴트 생성자가 없는 경우, 파생 클래스 객체를 만들 수 없음.

problem

  • base 클래스, base() 생성자, base(int), 소멸자 만들자.
  • derived 클래스, derived() 생성자, derived(int) , 소멸자 만들자.
    -> base 객체를 상속하고, 생성자 2개에서 base생성자 명시 호출은 없음.
  • main에서 derived d(5); 를 하고,
  • 이후에 base() 생성자를 주석처리하라.

상속과 생성자에 대해

1) 파생 클래스 생성자 호출 시, 기반 생성자가 호출완료된 후에,
파생 생성자 블록으로 진입함.
2) 파생 생성자에서 초기화로 기반 생성자 호출을 명시하지 않으면,
컴파일러가 기반의 디폴트 생성자를 호출함.

Derived() {}

// 사실은 위에 코드는 
Derived() : Base() {} 
// 이렇게 컴파일러가 암시 호출함.

Derived(int a){} 
// =>
Derived(int a) : Base() {}

3) 기반에서 인자가 있는 생성자를 작성할 경우, 컴파일러는
디폴트 생성자를 암묵적으로 파생에서 만들어주지 않음.
4) 기반 클래스의 다른 생성자를 호출하고 싶다면,
파생클래스의 생성자에서 반드시 명시해야 함.

problem

  • 코드를 보고 에러를 찾아라.
    • 1번 코드

      class animal
      {
      private :
      animal() {}
      }
      class dog : public animal
      {
      public :
      dog() {}
      }
      main()
      {
      animal a;
      dog d;
      }

    • 2번 코드

      class animal
      {
      protected :
      animal() {}
      }
      class dog : public animal
      {
      public :
      dog() {}
      }
      main()
      {
      animal a;
      dog d;
      }

-> 정답은 다음장에서

  • 결과
    : 기반클래스의 생성자를 private에 위치하면, 기반객체든, 상속 객체든
    생성 불가함.

protected 생성자.

의도

: 자신은 객체를 만들 수 없지만, 파생 클래스의 객체는 만들 수 있게 함.

profile
🔥🔥🔥

0개의 댓글