Thread View: pl.comp.lang.c
4 messages
4 total messages
Started by Borneq
Thu, 15 Mar 2018 18:41
Destructor a funkcja wirtualna
Author: Borneq
Date: Thu, 15 Mar 2018 18:41
Date: Thu, 15 Mar 2018 18:41
20 lines
1613 bytes
1613 bytes
Mam klasę abstrakcyjną Node i metodę wirtualną toString()
chcę podczas kasowania obiektów wypisywać nazwę tego obiektu:
virtual ~Node()
{
printf("delete %s\n",toString().c_str());
}
Nie udało się zrobić:
virtual string toString() = 0
zrobiłem
virtual string toString(){ return "abstract";};
nadpisuję te metodę w klasach ,ale i tak destructor woła ją nie wirtualnie.
Pytanie: jak zrobić wypisywanie w destructorze elementów które kasuje
podczas gdy korzystam z takich pól jak name, które jest zdefiniowane w
innych klasach?
Ale chyba rozumiem w czym problem, ten destruktor to za późne
przechwycenie, bo w toString miałem wypisywać całe drzewka mające w
korzeniu obiekt Node na rzecz którego wołam, a w destruktorze i tak
byłyby pokasowane.
Re: Destructor a funkcja wirtualna
Author: Sebastian Biały
Date: Thu, 15 Mar 2018 19:55
Date: Thu, 15 Mar 2018 19:55
11 lines
1329 bytes
1329 bytes
On 3/15/2018 7:41 PM, Borneq wrote:
> Mam klasę abstrakcyjną Node i metodę wirtualną toString()
> chcę podczas kasowania obiektów wypisywać nazwę tego obiektu:
> virtual ~Node()
> {
> printf("delete %s\n",toString().c_str());
> }
Typ obiektu podczas konstrukcji i destrukcji zawiera inną tablicę
wirtualną niż po konstrukcji i przed destrukcją. Innymi słowy za
wcześnie albo za późno.
Re: Destructor a funkcja wirtualna
Author: szykcech
Date: Thu, 15 Mar 2018 20:56
Date: Thu, 15 Mar 2018 20:56
16 lines
2351 bytes
2351 bytes
> nadpisuję te metodę w klasach ,ale i tak destructor woła ją nie wirtualnie. Z tego co pamiętam metody wirtualne nie działają w konstruktorach i destruktorach. > Pytanie: jak zrobić wypisywanie w destructorze elementów które kasuje > podczas gdy korzystam z takich pól jak name, które jest zdefiniowane w > innych klasach? Chyba tylko przez podanie klasy z której ma być wywołana Klasa::toString() i w tej funkcji wywoływać wcześniejsze wersje tej funkcji. > Ale chyba rozumiem w czym problem, ten destruktor to za późne > przechwycenie, bo w toString miałem wypisywać całe drzewka mające w > korzeniu obiekt Node na rzecz którego wołam, a w destruktorze i tak > byłyby pokasowane. Nie były by pokasowane dopóki destruktor nie zostanie wykonany lub dopóki sam nie usuniesz drzewka w destruktorze (zależnie jak był tworzony - jako zmienna klasy czy przez new).
Re: Destructor a funkcja wirtualna
Author: M.M.
Date: Sat, 17 Mar 2018 21:12
Date: Sat, 17 Mar 2018 21:12
11 lines
1694 bytes
1694 bytes
On Thursday, March 15, 2018 at 7:41:39 PM UTC+1, Borneq wrote:
> Mam klasę abstrakcyjną Node i metodę wirtualną toString()
> chcę podczas kasowania obiektów wypisywać nazwę tego obiektu:
> virtual ~Node()
> {
> printf("delete %s\n",toString().c_str());
> }
Ja bym najpierw dodał flush po printf. Jeśli nie zadziała, to daj znać.
Pozdrawiam
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads