Dziedziczenie wielokrotne i destruktor

0

Witam!
Mam takie pytanie. Otóż deklarując klasę abstrakcyjną zadeklarowałem destruktor jako metodę czysto wirtualną.

class Ab
{
   // ....
public:
   virtual ~Ab() = 0;
};

Następnie zacząłem dziedziczyć z tej klasy AB

class Dz : virtual public Ab
{
 // ...
};

class Dz2 : virtual public Ab
{
 // ....
};

class Z : public Dz, public Dz2
{
// ...
}

W żadnej z nich nie pisałem jawnego destruktora. Podczas kompilacji programu zaczęło wywalać mi błąd, gdyż nie zadeklarowałem destruktora z klasy Ab. Musiałem więc dopisać kod

Ab::~Ab() 
{
}

I tutaj nasuwa się kilka pytań:

  • Jeżeli jako metodę czysto wirtualną oznaczę zwykłą metodę, to muszę ją zadeklarować w każdej klasie podrzędnej?
  • Jeżeli w każdej klasie podrzędnej zadeklarowałbym konstruktor, to czy musiałbym deklarować destruktor z klasy Ab? Czy może destruktor to taki "wyjątek", że trzeba go deklarować w klasie bazowej?
  • Hierarhia dziedziczenia w tych klasach wygląda tak:
    Ab
   /   \   
  Dz    Dz2
   \   /
     Z

Jeżeli klasy Dz i Dz2 dziedziczą wirtualnie z klasy Ab, to klasa Z nie musi dziedziczyć wirtualnie? Dlaczego?

0

Pytania są trochę... niezwiązane z naturą problemu.

Zadeklarowałeś klasę z wirtualnym destruktorem. Potem, jak się domyślam, stworzyłeś zmienną tej klasy, albo klasy pochodnej...

class Ab
{
public:
   virtual ~Ab() = 0;
};

Ab a;
class Dz : public Ab // bez znaczenia czy virtual czy nie
{
};

Dz b;

Taka deklaracja zmiennej (czy to lokalnej czy globalnej) wiąże się z wywołaniem konstruktora i destruktora klasy.
A jaki destruktor miałby się wykonać, skoro jest on abstrakcyjny?

1 użytkowników online, w tym zalogowanych: 0, gości: 1