2013-11-26 1 views
0

파생 클래스 생성자 호출에서 기본 클래스 생성자가 호출되는시기를 알아야합니다.생성자에서 호출되는 기본 클래스의 생성자는 어느 지점에 있습니까?

Small example: 

class Base1 
{...} 

class Base2 
{...} 

class Derived : Base1,Base2 
{...} 

int main (int argc, char** argv) 
{ 
Derived Child; 
} 
Derived의 생성자가 호출 명령 Derived Child;으로

,하지만 난 Derived 클래스 생성자가 실행되기 전에 모든 기본 생성자, Base1과 Base2의 즉 생성자를 실행된다는 점을 읽었습니다.

그래서 내가 클래스 Derived의 생성자이

Derived::Derived (Parameters) 
:      //initialization list 
Base2 (Parameters) 
{...} 

처럼 보였다 경우 이벤트 순서는 것이 얼마나 궁금 이제 생성자 Derived의 initialazation 목록에서 호출 클래스 Base2의 생성자가 아니면 이전에 호출입니다 . 또한 모든 기본 클래스 생성자는 생성자 Derived 호출 시작시 또는 Derived 생성자 초기화 목록이 시작될 때 호출됩니다.

인사 streight 생성자의 호출의

+1

fyi, 기본 * 클래스가 아닌 * 기초 * 클래스 – benjymous

답변

1

주문은 1 차 기본 클래스 다음 파생 클래스입니다. 현재 예를 생성자의 호출의 위해

은이다 : 우리가 파생

클래스에 클래스 정의를 변경하는 경우

을 유도 Basis1 Basis2 : Basis2을 Basis1

생성자의 다음 순서 전화는 다음과 같습니다. Basis2 Basis1 Derived

기본 클래스 생성자는 초기화 목록에서 명시 적으로 호출되었는지 여부에 관계없이 항상 파생 클래스보다 먼저 호출됩니다.

+0

그래서 기본 생성자의 초기화는 기본 생성자의 호출에 즉시 사용됩니까? 컴파일러는 먼저 기본 생성자를 호출하기 전에 초기화 목록을 읽습니까? – Streight

+0

이 코드를 확인하면 https://drive.google.com/file/d/0B1xNtnsgZBdpZXZ3TEhpUTFoRVk/edit?usp=sharing에서 프로그램의 출력에 기본 클래스 ctr이 먼저 호출 된 다음 초기화 목록이 처리 되었음이 분명하게 표시됩니다. – Nik

+0

마지막 질문 : 1. 코드를 http://www.file-upload.net/download-8335688/main.cpp.html로 변경했습니다. 출력이'x : 2 '로 표시되는 이유는 무엇입니까? 2. 초기화 기본 설정에서 초기화 될 때 기본 생성자가 여러 번 호출됩니까? – Streight

관련 문제