destructor virtual vs destructor pur virtual

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
vili_c++
Junior
Junior
Posts: 21
Joined: 11 Feb 2014, 23:39
Judet: Dolj

destructor virtual vs destructor pur virtual

Post by vili_c++ » 07 Nov 2018, 22:33

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 ?



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: destructor virtual vs destructor pur virtual

Post by Ovidiu Cucu » 06 Jun 2019, 20:46

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: destructor virtual vs destructor pur virtual

Post by Ovidiu Cucu » 06 Jun 2019, 20:59

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
};

vili_c++
Junior
Junior
Posts: 21
Joined: 11 Feb 2014, 23:39
Judet: Dolj

Re: destructor virtual vs destructor pur virtual

Post by vili_c++ » 07 Jun 2019, 19:51

Multumesc de raspuns.

Post Reply