2017-09-15 8 views
1
#include<iostream> 
using namespace std; 

class Mahesh 
{ 

    public: 
     Mahesh(){ 
     cout<<"Base Constructor is called at here"<<endl<<endl; 
     } 
     virtual ~ Mahesh() 
     { 
     cout<<"Base Destructor is called"<<endl<<endl; 
     } 
}; 

class Purnima:public Mahesh 
{ 

    public: 

     Purnima() 
     { 
     cout<<"Derived class constructor"<<endl<<endl; 
     } 
     ~Purnima(){ 
     cout<<"Derived class Destructor"<<endl<<endl; 
     } 
}; 

int main() 
{ 
    Mahesh *m1; 
    Purnima p1; 
    m1=&p1; 

    return 0; 
} 

거의 작동?생략 키워드는 아직도 내가 다음 코드 위의 소멸자 앞에 키워드 <code>virtual</code>를 작성하지 않는 경우 내 질문은 다음, 왜 가상 소멸자 잘 작동합니다

+1

더 나은 복제본 : https://stackoverflow.com/q/461203/501250 – cdhowie

+4

복제본이 적절하지 않습니다. 해답은 파생 된 소멸자에서 다시 지정하는지 여부에 관계없이 '가상'이 상속된다는 것입니다. – EJP

+3

소멸자를 다형 적으로 호출조차하지 마십시오. 근본적으로 파생 클래스를 파기하면 부모 파생 클래스와 파생 클래스가 파기됩니다. – chris

답변

0

int main() 
{ 
    Mahesh *m1; 
    Purnima p1; 
    m1=&p1; 

    return 0; 
} 

같은 코드를 작성할 때 당신은 Purnima p1 당신이 범위 나갈 때 적절한 소멸자 시퀀스 전화를받을 이유 .. 그건 자동으로 파괴 얻을.

어쨌든 m1은 삭제할 수 없습니다.

더 잘 이해할 수 있도록 범위 내부를 둘러보십시오.

int main() 
{ 
    { 
    Mahesh *m1; 
    Purnima p1; 
    m1=&p1; 
    } 
    cout<<"After Scope.."<<endl; 

    return 0; 
} 

"After Scope"는 소멸자 호출 후에 인쇄되어야합니다. 동적 유형을 처리 할 때

그래서 간단히 말해서, 당신은하지 수 있도록이 코드에서

+0

로컬 변수를 가리 키기 위해 unique_ptr을 할당하면 어떻게되는지 궁금했을 때 이와 비슷한 생각을 가졌습니다. 그들은 완전히 바보가 아닙니다. – Zebrafish

1

아무것도, 정말, 잘 작동을 가상 소멸자를 필요로하지 않는다 virtual이 필요합니다. 기본 유형에 대한 포인터를 통해 파생 된 유형의 객체를 삭제하는 경우 가상 소멸자가 필요합니다.

Mahesh의 소멸자가 가상이 아닌 경우
Mahesh *m1 = new Purnima; 
delete m1; 

,이 코드가 정의되지 않은 한 행동이처럼. 주의 : 정의되지 않은 동작의 가장 교활한 표현 중 하나는 코드가 "잘 작동합니다"라는 것인데, 중요한 고객에게 데모를 준비 할 때까지 약간의 변경을 가할 때까지 코드가 "훌륭하게 작동합니다"라는 점에서 비참하게 실패 할 것입니다.

+0

일단 문제가 분명 해지면 원인을 찾는 데 걸린 시간과 문제를 해결하는 데 사용할 수있는 시간이 서로 부정적으로 연관되어 있다는 사실을 잊어 버렸습니다. 시간이 짧을수록 더 많이 필요합니다. :-) – Peter