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

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

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

    #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