C++ 유도된 클래스들의 생성 순서

2021. 3. 19. 19:48·SW개발/C++
반응형

유도된 클래스들의 생성 순서

  • 당연하게도 부모 클래스부터 생성된다.

    #include <iostream>
    
    class Mother
    {
      int i_;
    
    public:
      Mother()
        : i_(1)
      {
        std::cout << "Mother construction\n";
      }
    };
    
    class Child : public Mother
    {
      double d_;
    
    public:
      Child()
        : d_(1.0)
      {
        std::cout << "Child construction\n";
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Child c;
    }
    
    /* stdout
    Mother construction
    Child construction
    */

  • 멤버 이니셜라이저 리스트

    • 위의 예제에서 Mother::i_의 접근 권한을 public으로 변경하고, Child 생성자에서 멤버 이니셜라이저 리스트로 값을 설정하려하면 다음과 같은 에러가 발생한다.

      error C2614: 'Child': illegal member initialization: 'i_' is not a base or member
    • i_ 대신에, 존재하지 않는 변수인 dummy로 변경하여 컴파일해봐도 같은 오류가 발생한다.

      error C2614: 'Child': illegal member initialization: 'dummy' is not a base or member
    • 즉, 멤버 이니셜라이저 리스트로 초기화할 수 있는건 해당 클래스의 멤버 변수만 해당되는 것을 알 수 있다.

    • 대신 멤버 이니셜라이저 리스트에서 부모 클래스의 생성자를 호출할 수 있고, C++11부터 위임 생성자도 사용 가능하므로 이를 사용하면 될 것 같다.

      #include <iostream>
      
      class Mother
      {
        int i_;
      
      public:
        Mother(const int & i_in = 0)
          : i_(i_in)
        {
          std::cout << "Mother construction\n";
        }
      };
      
      class Child : public Mother
      {
        double d_;
      
      public:
        Child()
          : d_(1.0), Mother(1024)
        {
          std::cout << "Child construction\n";
        }
      };
      
      int        main()
      {
        using namespace std;
      
        Child c;
      }
      
      /* stdout
      Mother construction
      Child construction
      */
    • 부모 클래스의 생성자를 명시하지 않아도 부모 클래스의 기본 생성자가 호출된다.

      • 다음 예제는 부모 클래스의 기본 생성자가 존재하지 않아서 에러가 발생한다.
      #include <iostream>
      
      class Mother
      {
          int i_;
      
      public:
          Mother(const int& i_in)
              : i_(i_in)
          {
              std::cout << "Mother construction\n";
          }
      };
      
      class Child : public Mother
      {
          double d_;
      
      public:
          Child()
              : d_(1.0)
          {
              std::cout << "Child construction\n";
          }
      };
      
      int        main()
      {
          using namespace std;
      
          Child c;
      }
      error C2512: 'Mother': no appropriate default constructor available
반응형
저작자표시 (새창열림)

'SW개발 > C++' 카테고리의 다른 글

C++ 상속과 패딩  (0) 2021.03.20
C++ 유도된 클래스들의 소멸 순서  (0) 2021.03.19
C++ 상속 Teacher-Student 예제  (0) 2021.03.19
C++ 상속 기본 예제  (0) 2021.03.19
C++ 상속 (Inheritance)  (0) 2021.03.19
'SW개발/C++' 카테고리의 다른 글
  • C++ 상속과 패딩
  • C++ 유도된 클래스들의 소멸 순서
  • C++ 상속 Teacher-Student 예제
  • C++ 상속 기본 예제
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 전체보기 (319)
      • SW개발 (268)
        • Java Spring (6)
        • C++ (186)
        • Python (21)
        • Linux (16)
        • 알고리즘 (13)
        • Git (4)
        • Embedded (1)
        • Raspberrypi (9)
        • React (3)
        • Web (2)
        • Windows Device Driver (6)
      • IT(개발아님) (46)
        • Windows (26)
        • MacOS (7)
        • Utility (11)
      • 챗봇 짬통 (0)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    windows
    EXCLUDE
    citrix workspace
    SunOS 5.1
    제외
    스프링 프레임워크 핵심 기술
    Workspace
    dism
    spring
    윈도우
    java
    MacOS
    그림판
    시스템 복구
    KakaoTalk
    unix
    백기선
    스프링
    vscode
    맥북 카카오톡 알림 안뜸
    mspaint
    알림
    Solaris 10
    윈도우 명령어
    SFC
    Windows 11
    로지텍 마우스 제스처
    logi options
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
C++ 유도된 클래스들의 생성 순서
상단으로

티스토리툴바