Sunday, April 12, 2009

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:

#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 :]