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

2021. 3. 19. 19:48·C++/Class

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

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

    #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
저작자표시 (새창열림)

'C++ > Class' 카테고리의 다른 글

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
'C++/Class' 카테고리의 다른 글
  • C++ 상속과 패딩
  • C++ 유도된 클래스들의 소멸 순서
  • C++ 상속 Teacher-Student 예제
  • C++ 상속 기본 예제
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 분류 전체보기 (317)
      • Algorithm (13)
        • 알기 쉬운 알고리즘 (10)
        • Search (1)
        • Sort (2)
      • Arduino (0)
      • C++ (185)
        • Class (46)
        • Exception (6)
        • Library (51)
        • Overloading (10)
        • SmartPointer (5)
        • Syntax (33)
        • TBC++ (23)
        • Templates (9)
        • VisualStudio (2)
      • Embedded (1)
      • Git (4)
      • Java (5)
      • Linux (16)
        • Error (1)
        • Linux Structure (11)
      • MacOS (7)
      • OS (1)
        • Concurrency (1)
      • Python (21)
        • Class (1)
        • Function (2)
        • Syntax (17)
      • Raspberrypi (9)
      • Review (1)
      • Utility (12)
        • VSCode (5)
        • VirtualBox (3)
      • Web (8)
        • Nginx (1)
        • React (3)
        • Django (1)
      • Windows (20)
        • Registry (3)
        • WSL (1)
        • DeviceDriver (6)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.