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?