2014-06-18 4 views
0
#include <iostream> 
#include <string> 
using namespace std; 

class A 
{ 
    private: 
     int ai; 
     string as; 
}; 
class B : public A 
{ 
    private: 
     int bi; 
     string bs; 
}; 


int main() 
{ 
    B bob; 

    return 0; 
} 

클래스 A와 B에는 기본 생성자가 있습니다. 그리고 클래스 A 기본 생성자가 먼저 호출 된 다음 B 기본 생성자가 호출된다는 것을 알고 있습니다. 그러나 문제는 그것이 내부적으로 어떻게 발생 하는가입니다. 데이터 멤버가 상속 순서로 생성됩니까? 컴파일러는 어떻게 dervied ctor에서 기본 ctor로 전화를 걸립니까?파생 클래스 생성자가 내부적으로 기본 클래스 생성자를 호출하는 방법

+0

참조 http://stackoverflow.com/a/6308944/1463922 – PiotrNycz

+0

@Bathsheba Nope! 복제본이 아닙니다. 나는 그 행동이 무엇인지 묻지 않을 것이다. 내부적으로 어떻게 수행되는지를 묻습니다. 컴파일러에 의해 ctor가 먼저 호출되는 방법? – deepdive

+0

@deepdive 컴파일러 제작자는 원하는대로 동작을 구현할 수 있습니다. 알아내는 유일한 방법은 컴파일러 소스 또는 생성 된 어셈블리를 읽는 것입니다. – molbdnilo

답변

2

기본적으로 기본 클래스가 초기화 된 다음 데이터 멤버가 선언 순서대로 초기화됩니다. 첫 번째 예외는 가장 먼저 파생 된 클래스에서 초기화되는 가상 기본 클래스입니다. 또 다른 예외는 생성자를 위임하는 것입니다.


Standardeese는 : C++ 11 이것은 §12.6.2/10에 의해 지정되어

을 비 위임 생성자에서 다음 순서로 초기화 진행 :

  • 먼저 가장 많이 파생 된 클래스 (1.8)의 생성자에 대해서만 가상 기본 클래스가 으로 깊이 우선 왼쪽에서 오른쪽으로 나타나는 순서로 초기화됩니다 "왼쪽에서 오른쪽으로"는 파생 클래스의 기본 클래스가 나타나는 순서입니다. 기본 지정자 목록입니다. 그들은 (관계없이 MEM-이니셜의 순서)를베이스 지정자리스트 에 나타나는
  • 후, 바로 기본 클래스가 선언 위하여 초기화된다.
  • 그런 다음 정적이 아닌 데이터 멤버는 클래스 정의 에서 선언 된 순서대로 초기화됩니다 (다시 mem-initializers의 순서와 관계 없음).
  • 마지막으로 복합체 본문의 compound-statement이 실행됩니다.

[참고 : 선언 순서가베이스 있도록 의무화 부재 하위 객체가 초기의 역순 파괴. -end 노트이 내부적으로 어떻게 작동하는지에 관해서는


은 일반적인 기술은 생성자가 관련 기준 및 일반 회원의 생성자를 호출하는 것입니다. 가상베이스 및 생성자 위임을 무시하고 클래스 T의 인스턴스화를 고려하면 T를 인스턴스화 할 때 처음으로 T 생성자가 호출된다는 것입니다. 그러나 아직 T 인스턴스 자체의 초기화는 아닙니다. 실행은 여전히 ​​해당 생성자의 메모리 초기화 프로그램 목록에 있습니다. 여기서는 다양한 기본 및 비 기본 멤버 생성자를 호출합니다 (여기서 반복적으로 발생합니다). 마지막으로 생성자 본문이 실행됩니다.

+0

하지만 내부적으로 어떻게 이루어 졌습니까? 그게 질문입니다 ... – deepdive

+2

컴파일러는 표준을 따르는 한 어떤 방식 으로든 동작을 구현할 수 있습니다. – Bathsheba

+0

나는 질문이 * 컴파일러를 어떻게 관리하는지 짐작한다. * – Rakib

관련 문제