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 |