Seite 1 von 1

delete -> Oberklasse -> geht das gut?

Verfasst: 27. Juli 2009 09:21
von nebler
Hallo liebe Leute.

Folgende Überlegung:
Ich hab folgende Architektur:
Parent <- Child

Wenn ich jetzt Objekte vom Typ Child erstelle.
Child* pChild = new Child();

Und dann irgendwo mal das Caste - aus programmier technischen Gründen.
Parent* pParent = (Parent*)pChild;

Und dann:
delete pParent;

ausführe. Wird dann der komplett belegte Speicher gelöscht, was pChild belegt? Oder fliegt mir dann die Applikation um die Ohren?

Vielen Dank.

Bis dann

Jakob

Verfasst: 27. Juli 2009 10:56
von Christian81
Das funktioniert nur wenn der Destruktor virtuell ist (was z.B. bei nahezu allen Qt-Klassen der Fall ist da QObject einen virtuelle Destruktor hat)

Verfasst: 27. Juli 2009 11:47
von RHBaum
noch ne Anmerkung dazu:

Klassen, die keinerlei virtuelle methoden haben, sollt man ned ableiten.
Hat eine klasse mindestens eine virtuelle methode neben dem DTOR, macht es technisch keinen Sinn, den DTOR nicht virtuell zu machen.

D.h. das vorhandensein des virtuellen destrukturs ist eigentlich ein indikator fuer, ob man fuer ne klasse ableiten darf (vom entwickler vorgesehen) oder ned.

Folgerung: Klasse zum ableiten vorgesehen = virtueller Dtor = du kannst bedenkenlos die instanz ueber einen basisklassenzeiger loeschen.

BTW:
"Parent"-"Child" ist bei GUI basierten Anwendungen ne ganz schlechte Idee fuer "Benamsung", wenn du vererbung damit darstellen willst. Bei Guis wird mit parent-Child meist die hirarische Fenster-Struktur beschrieben, was nix mit ableitung zu tun hat ....

Verfasst: 27. Juli 2009 15:29
von nebler
Vielen Dank für die Antworten.

Ich hab das nicht bei mir so im Quellcode stehen ^^.
Wollte das Allgemein wissen, unabhängig zu Qt.

In meinem Fall triffts die Qt Komponenten "QGraphicsItem" und deren abgeleiteten Klassen.

Parent & Child sind nciht wirklich aussagekräftig um daraus abzuleiten was die so machen ^^.

Danke nochmal.

Einen schönen Tag noch.

Grüße

Verfasst: 28. Juli 2009 09:56
von graythornWW

Code: Alles auswählen

Hat eine klasse mindestens eine virtuelle methode neben dem DTOR, macht es technisch keinen Sinn, den DTOR nicht virtuell zu machen.
hier könnte man ergänzend hinzufügen, das der Destruktor einer Klasse automatisch virtuell ist, wenn das in der Basisklasse auch der Fall ist, also Unabhängig vom Schlüsselwort "virtual".