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 ?
destructor virtual vs destructor pur virtual
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: destructor virtual vs destructor pur virtual
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.
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.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: destructor virtual vs destructor pur virtual
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
va avea o eroare la linkeditare
Pentru a scapa de eroare, trebuie sa adaugi definitia destructorului lui Base.
Sau asa:
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;
}
Code: Select all
Error LNK2019 unresolved external symbol "public: virtual __thiscall Base::~Base(void)"
Code: Select all
Base::~Base()
{
}
Code: Select all
struct Base // abstract class
{
virtual ~Base() = 0 {}; // pure virtual destructor
};
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: destructor virtual vs destructor pur virtual
Multumesc de raspuns.