문제

C ++에서 클래스를 우선시 할 때 (가상 파괴자와 함께) 상속 클래스에서 가상으로 소멸자를 다시 구현하고 있지만 기본 파괴자를 호출해야합니까?

그렇다면 나는 그것이 이런 것 같다고 생각합니다 ...

MyChildClass::~MyChildClass() // virtual in header
{
    // Call to base destructor...
    this->MyBaseClass::~MyBaseClass();

    // Some destructing specific to MyChildClass
}

내가 맞아?

도움이 되었습니까?

해결책

아니요, 파괴자는 역 순서로 자동으로 호출됩니다. (기본 클래스 마지막). 기본 클래스 소멸자에게 전화하지 마십시오.

다른 팁

아니오 기본 소멸자를 호출 할 필요는 없습니다. 기본 소멸자는 항상 파생 된 소멸자에 의해 귀하를 요구합니다. 파괴 순서는 여기에서 내 관련 답변을 참조하십시오..

기본 클래스에서 가상 파괴자를 원하는 이유를 이해하려면 아래 코드를 참조하십시오.

class B
{
public:
    virtual ~B()
    {
        cout<<"B destructor"<<endl;
    }
};


class D : public B
{
public:
    virtual ~D()
    {
        cout<<"D destructor"<<endl;
    }
};

할 때 :

B *pD = new D();
delete pD;

그런 다음 B에 가상 파괴자가 없다면 ~ B () 만 호출됩니다. 그러나 가상 파괴자가 있으므로 첫 번째 ~ d ()가 호출되면 ~ b ().

다른 사람들이 말한 내용이지만 파생 클래스에서 소멸자 가상을 선언 할 필요는 없습니다. 기본 클래스에서와 마찬가지로 소멸자 가상을 선언하면 모든 파생 된 파괴자는 선언 여부에 관계없이 가상이됩니다. 다시 말해:

struct A {
   virtual ~A() {}
};

struct B : public A {
   virtual ~B() {}   // this is virtual
};

struct C : public A {
   ~C() {}          // this is virtual too
};

아니요. 파생에서 '체인'으로 기본 메소드를 명시 적으로 호출하는 다른 가상 방법과 달리 컴파일러는 생성자가 호출되는 역 순서로 소멸자를 호출하는 코드를 생성합니다.

아니요, 당신은 기본 클래스 소멸자라고 부르지 않습니다. 다른 사람들이 지적한 것처럼 항상 자동으로 호출되지만 결과와 함께 개념 증명이 있습니다.

class base {
public:
    base()  { cout << __FUNCTION__ << endl; }
    ~base() { cout << __FUNCTION__ << endl; }
};

class derived : public base {
public:
    derived() { cout << __FUNCTION__ << endl; }
    ~derived() { cout << __FUNCTION__ << endl; } // adding call to base::~base() here results in double call to base destructor
};


int main()
{
    cout << "case 1, declared as local variable on stack" << endl << endl;
    {
        derived d1;
    }

    cout << endl << endl;

    cout << "case 2, created using new, assigned to derive class" << endl << endl;
    derived * d2 = new derived;
    delete d2;

    cout << endl << endl;

    cout << "case 3, created with new, assigned to base class" << endl << endl;
    base * d3 = new derived;
    delete d3;

    cout << endl;

    return 0;
}

출력은 다음과 같습니다.

case 1, declared as local variable on stack

base::base
derived::derived
derived::~derived
base::~base


case 2, created using new, assigned to derive class

base::base
derived::derived
derived::~derived
base::~base


case 3, created with new, assigned to base class

base::base
derived::derived
base::~base

Press any key to continue . . .

기본 클래스 소멸자를 가상으로 설정하면 사례 3 결과가 Case 1 & 2와 동일합니다.

아니요. 자동으로 호출됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top