Trochę o dziedziczeniu
No więc każdy kto używał dłużej C++ na pewno korzystał lub korzysta z dziedziczenia ja w miarę niedawno miałem okazję doświadczyć ciekawej sytuacji, a oto jej uproszczona forma:
No i tutaj powstaje pytanie czy wyświetlona zostanie wartość "BA " czy "A" ? Dla wielu będzie oczywiste, że wyrzucona zostanie "BA". Niestety jak to w życiu bywa nic nie jest takie proste jak się wydaje. Program wyrzuca "A" :] powód jest prosty:
#include "iostream.h"
class a
{
public:
a(){}
~a(){ printf("A"); }
};
class b:public a
{
public:
b(){}
~b(){ printf("B"); }
};
int main ( void )
{
a* val = new b();
delete val;
system("pause");
return 0;
}
No i tutaj powstaje pytanie czy wyświetlona zostanie wartość "BA " czy "A" ? Dla wielu będzie oczywiste, że wyrzucona zostanie "BA". Niestety jak to w życiu bywa nic nie jest takie proste jak się wydaje. Program wyrzuca "A" :] powód jest prosty:
typ a nic nie wie o tym, że dziedziczy po nim b a to właśnie jego usuwamy. Więc dla deleta oczywiste jest żeby wywołać jedyny destruktor o którym wie czyli a.
No i pytanie: jak to ominąć ? rozwiązanie okazuje się bardzo proste wystarczy linijkę:
~a(){ printf("A"); }
zamienić na:
virtual ~a(){ printf("A"); }
Warto o tym wiedzieć przy programowaniu gdyż u mnie sprawiało to dość sporo problemów przy pisaniu klas zarządzających obiektami :]
Comments
Post a Comment