나는 가상 소멸자와 약간의 실험을하고 있었다 검토 - 궁금 사람이 다음 (2010 대 사용)에 대한 간단한 설명이있는 경우 :4 레벨 상속 체인에있는 C++ 가상 소멸자.
가내가 클래스 계층 구조 ABCD 정의를, D는 C가 상속, C는 B가, B는 상속 상속 A, A는 기본입니다. -
A는 가상 소멸자를 가지고
첫 번째 실험 :
는이 실험을 달렸다.B는 --------------
C가
D가 아닌 가상 소멸자에게
//를 갖는 가상 소멸자를 갖는 비 가상 소멸자 갖는다 --------------
D 유형의 힙에 4 개의 개체 할당 - 처음에는 A *, B * 및 C * 포인터를 가리킴 - 4 번째는 a로 지정 D * 완전성. 4 개의 포인터를 모두 삭제하십시오.
예상대로 모든 4 개의 인스턴스에서 전체 소멸자 체인이 D에서 A로 역순으로 실행되어 모든 메모리가 해제됩니다.
번째 실험 -
A는 비가 상 소멸자 갖는다 ** 비 가상
B에 A를
C 가상 소멸자에게
D를 가지는 비 가상 소멸자 변경됨 비 가상 Distructor가 있음
D 유형의 힙에 4 개의 객체를 할당합니다. Point - 첫 번째 3 - Leave에서 A *, B * 및 C *의 포인터 완전성을위한 D *로 네 번째.
C * 및 D * 포인터를 삭제하면 : 완전한 소멸자 체인은 D에서 A로 역순으로 실행되어 모든 메모리가 해제됩니다.
B의 * 삭제 : B 다음 소멸자가 실행되는 (누설)
삭제의 A * : 만 소멸자가 실행되는 (누설)이 왜
사람이 설명 할 수 있습니까?
실험 2에서 D 유형 opjects가 할당되면 직접 기본 클래스 (C)에 가상 소멸자가 있습니다. 컴파일러에게이를 Vptr로 추적하고 메모리 유형을 알 수 있습니까? 참조에 관계없이? vptr에서 그것을 추적하고 메모리를 알고 컴파일러에게 나던 -
감사 마이크
D 형 opjects는 실험 2에 할당
예제 코드를 제공하면 멋질 것입니다. – Rook
@Rook이 사례를 설명하는 코드 스 니펫을 게시했습니다 (거의 동일하게). 의견이 있으면 알려주십시오. –