Page 1 of 1

destructor virtual vs destructor pur virtual

Posted: 07 Nov 2018, 22:33
by vili_c++
Destructorul virtual al clasei de baza garanteaza ca obiectul clasei derivate este distrus corect, adica se apeleaza mai intai destructorul clasei derivate apoi destructorul clasei de baza (in ordinea inversa apelarii constructorilor).
Acelasi comportament il are si destructorul pur virtual, sigur avand cel putin o metoda pur virtuala vorbim de o clasa abstracta.
Si daca, comportamentul celor doi destructori este acelasi care este diferenta intre un destructor vitual si un destructor pur virtual ?
Este gresit ca intr-o clasa abstracta sa declar un destructor doar virtual ?

Re: destructor virtual vs destructor pur virtual

Posted: 06 Jun 2019, 20:46
by Ovidiu Cucu
Nu, nu este gresit ca sa ai intr-o clasa abstracta (care are macar o functie virtuala pura) un destructor care este doar virtual.
De obicei se declara un destructor virtual pur, pentru a se face o clasa abstracta in cazul in care nu are o alta functie care sa fie facuta virtuala pura.

Re: destructor virtual vs destructor pur virtual

Posted: 06 Jun 2019, 20:59
by Ovidiu Cucu
Mai trebuie adaugat faptul ca, deoarece in momentul distrugerii unui obiect se apeleaza toti destructorii din clasele de baza, spre deosebire de alte functii virtuale pure, trebuie sa aiba obligatoru si definitie (implementare). De exemplu, urmatorul programel

Code: Select all

struct Base // abstract class
{
    virtual ~Base() = 0; // pure virtual destructor
};

struct Derived : Base
{
    virtual ~Derived() = default;
};

int main()
{
    Derived obj;
    return 0;
}
va avea o eroare la linkeditare

Code: Select all

Error LNK2019 unresolved external symbol "public: virtual __thiscall Base::~Base(void)"
Pentru a scapa de eroare, trebuie sa adaugi definitia destructorului lui Base.

Code: Select all

Base::~Base()
{
}
Sau asa:

Code: Select all

struct Base // abstract class
{
    virtual ~Base() = 0 {}; // pure virtual destructor
};

Re: destructor virtual vs destructor pur virtual

Posted: 07 Jun 2019, 19:51
by vili_c++
Multumesc de raspuns.