2012-06-12 5 views
1
#include <iostream> 
    #include <cstdlib> 
    #include <string.h> 

    using namespace std; 

    class A { 
      public: 
      A() {cout<<" A\n";} 
      virtual ~A() {cout<<" ~A\n";} 
      }; 

    class B : public A { 
      public: 
      B() :A() {cout<<" B\n";} 
      virtual ~B() {cout<<" ~B\n";} 
      }; 

    int main (int, char *[]) { 
      A *ap = new B; 
      delete ap; 
      A b = *ap; 
      return 0; 
      } 

출력을 삭제 포인터를 할당 호출하기 것은 : (A)의 마지막 소멸자 A B = * AP 왜 A의없는 생성자을 요구 받고 왜소멸자가 새로운 객체에

A 

    B 

~B 

~A 

여기 전화 받고 있니?

감사합니다 !!!

답변

5

로 실행 중입니다. 정의되지 않은 동작이 발생할 수 있습니다.

당신이 그것을 역 참조에 불법 delete ap;를 호출 후 : 제쳐두고, 당신은 소멸자를 알고

delete ap; 
A b = *ap; 

가 상속의 역순이라고, 맞죠? 즉, B을 삭제하면 기본 클래스 소멸자 ~A도 호출됩니다.

유효하지 않은 경우 A b = *ap;은 생성자가 아닌 복사 생성자을 컴파일러에서 호출합니다.

+0

@ 루치아니아 ... 이제 얻었습니다 ... 감사합니다 !!! –

관련 문제