다중 상속 시 부모 클래스 간 생성자 호출 순서가 궁금합니다.
단일 상속 시에는 member initializer list에서 부모 클래스의 생성자와 멤버 간의 순서를 바꾸어도 무조건 부모 클래스의 생성자가 먼저 호출되었었는데, 다중 상속시에는 어떤 부모 클래스의 생성자가 먼저 호출될 지 궁금해서 테스트를 해봤습니다.
// USBDevice의 constructor
USBDevice(long id)
: m_id(id) {
cout << "USB" << endl;
}
// ~~~
// NetworkDevice의 constructor
NetworkDevice(long id)
: m_id(id) {
cout << "Network" << endl;
}먼저 생성자의 호출 순서를 알 수 있게 간단하게 문자열을 출력하도록 수정하였습니다.
class USBNetworkDevice : public USBDevice, public NetworkDevice {
public:
USBNetworkDevice(long usb_id, long net_id)
: USBDevice(usb_id), NetworkDevice(net_id) {
}
};위 코드와 같은 수정하지 않은 상태에서는 USB가 먼저 출력되고 그 다음 Network가 출력되었습니다. member initializer list에서 순서를 바꾸어도 똑같았구요.
class USBNetworkDevice : public NetworkDevice, public USBDevice {
public:
USBNetworkDevice(long usb_id, long net_id)
: USBDevice(usb_id), NetworkDevice(net_id) {
}
};다음으로는 상속할 클래스를 나열할 때의 순서를 바꾸었더니 Network 가 먼저 출력되고 다음으로 USB가 출력되었습니다.
상속할 클래스를 나열한 순서에 따라서 생성자의 호출 순서가 바뀐다고 보면 될까요?
아 그리고 이런 생성자 호출 순서를 고려해야 하는 작업이 있나요? 객체지향적으로 설계한다면 생성자의 호출 순서에 따라 결과가 바뀌도록 설계하진 않을 것 같아서요.
답변 2
3
안녕하세요, 질문&답변 도우미 Soobak 입니다.
네, 맞습니다.
C++ 에서 다중 상속을 할 경우, 부모 클래스들의 생성자는 클래스 선언에서 나열한 순서대로 호출됩니다.
예를 들어, class USBNetworkDevice : public USBDevice, public NetworkDevice 와 같이 선언하면, USBDevice 의 생성자가 먼저 호출되고, 그 다음에 NetworkDevice 의 생성자가 호출됩니다.
만약, 선언을 class USBNetworkDevice : public NetworkDevice, public USBDevice 로 변경한다면, NetworkDevice 의 생성자가 먼저 호출되고, 그 다음으로 USBDevice 의 생성자가 호출됩니다.
이는, 클래스의 초기화 과정에서 일관성, 예측 가능성을 위한 C++ 의 표준 규칙입니다.
1
답변 감사합니다! 그리고 아마 답변 다시던 중에 제가 수정을 해서 못 보신 것 같은데, 본문 마지막에 있는
아 그리고 이런 생성자 호출 순서를 고려해야 하는 작업이 있나요? 객체지향적으로 설계한다면 생성자의 호출 순서에 따라 결과가 바뀌도록 설계하진 않을 것 같아서요.
이 내용에 대해서는 어떻게 생각하시나요?
강의자료는 어디서 받을 수 있죠?
1
20
2
교재 있나요?
1
138
2
11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)
1
91
3
using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다
1
102
2
cstr직접구현
0
116
3
BubbleSort
1
78
2
숙제 마지막 부분
1
79
2
강의와 똑같이 진행했는데 링킹 에러가 발생합니다.
1
95
2
수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??
1
164
2
공변반환형 관련 문의 드립니다.
1
90
2
170강 유니크 포인터에대해 질문있습니다
1
81
1
섹션 5 퀴즈의 답이 이상합니다
1
84
2
이중포인터와 배열이 이해가 안됩니다.
1
159
2
5분 17~5분 34초 객체 잘림 질문
1
79
1
Resource.h 코드 알려주세요
1
72
1
char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다
1
94
2
화면좌측 숫자 보이기
1
115
1
화면 좌측 숫자 보이기
0
67
1
처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??
1
138
3
46강 string 버퍼 질문입니다
1
81
2
프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.
1
124
2
[] 범위 검사시 assert 사용 관련 질문
1
90
2
Lecture 클래스 멤버변수 명명 관련
0
92
2
프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요
0
74
1





