2014-12-16 5 views
2

범위를 벗어날 때 소멸자 호출 순서를 이해하려고합니다. 내가 자식 생성자와 소멸자는 부모로부터 파생 된 것을 알고, 이제범위를 벗어날 때 소멸자 호출 순서? (C++)

class Parent{ 

Parent(){cout<<"parent c called \n";} 
~Parent(){cout<< "parent d called \n";} 
}; 

class Child: public parent{ 

Child(){cout<< "child c called \n";} 
~Child(){cout<<"child d called\n";} 
}; 

, 그래서 다음과 같은 주요 :

int main(){ 

Parent Man; 
Child Boy; 

return 0; 
} 

는 출력을 생성합니다 :

의 나는 다음과 같은 코드가 있다고 가정 해 봅시다
parent c called 
parent c called 
child c called 
... //Now what? 

하지만 이제 범위를 벗어나면 어떻게됩니까? 컴파일 할 때 순서를 선택하는 방법은 여러 가지가 있습니다. 소년 먼저 파괴되는 경우에 적용 왼쪽 케이스

parent c called   |   parent c called  
parent c called   |   parent c called 
child c called   |   child c called 
child d called   |   parent d called 
parent d called   |   child d called 
parent d called   |   parent d called 

, 그리고 남자가 먼저 파괴되는 경우에 적용 우측 경우 : 나는 두 개의 출력 가능성을 가질 수 있습니다. 컴퓨터가 먼저 삭제할 컴퓨터를 어떻게 결정합니까?

+5

자동 개체, 임시 개체 및 멤버에 대한 소멸자 호출 순서는 생성자 호출과 반대입니다. – ach

+2

항상 프로그램을 실행하여 –

+4

@EdHeal을 찾을 수 있습니다. 아무 것도없는 증거 일 수 있습니다. 샘플은 진술을 위조 할 수는 있지만 결코 진술하지 못할 수 있습니다. – ach

답변

3

파생 된 소멸자는 조상 소멸자보다 먼저 호출됩니다. 따라서 Child 소멸자 본문이 먼저 호출 된 다음 Parent 소멸자 본문이 먼저 호출됩니다. 생성 된 객체는 역순으로 파괴되므로 Man 객체가 파괴되기 전에 Boy 객체가 파괴됩니다.

관련 문제