Page 1 of 1

[C++] Trebuie ca un destructor virtual pur sa fie definit?

Posted: 21 Jan 2009, 14:16
by Ovidiu Cucu
Problema

Code: Select all

class CFoo
{
public:
    virtual ~CFoo() = 0; // declare pure virtual destructor
};

class CBar : public CFoo
{
public:
    virtual ~CBar() {/*...*/}
};

int main()
{
    CBar bar; // linker error: "unresolved external symbol..." if CFoo::~CFoo has not a body.
    return 0;
}
Programelul de mai sus da eroare de link-editare atata timp cat CFoo::~CFoo() este doar declarata nu si definita.

Intrebare
Este obligatoriu sau nu ca un destructor declarat virtual pur sa aiba definitie (implementare/body)?

Raspuns
Da, in cazul cand instantiez cel putin un obiect dintr-o clasa derivata.
La distrugerea acelui obiect, conform regulii de apelare a destructorilor, se va apela si destructorul din clasa de baza abstracta.
Deci, in acest caz destructorul respectiv (fie el si pure virtual) trebuie sa fie definit.

Note
Un lucru similar se poate intampla pentru orice functie virtuala pura (alta decat destructorul).
In practica, cel mai frecvent o functie virtuala pura este doar declarata, nu si definita pentru ca implementarea este intr-o clasa derivata (concreta).
Desi o functie virtuala pura nu se poate apela printr-un obiect al clasei (o clasa abstracta nu poate fi instantiata), totusi o pot apela intr-una din metodele unei clase derivate si atunci va trebui sa aiba si definitie.

Code: Select all

struct CFoo 
{
    virtual void f() = 0; // declare pure virtual method
};

struct CBar : CFoo
{
    virtual void f() 
    {
        CFoo::f(); // call pure virtual method of base class
        //...
    }  
};

int main()
{
    CBar bar; // linker error because CFoo::f() has not a body
    return 0;
}

Next FAQ >>