Permalänk

C++ - Destruktor vid arv

Antag att klass B ärver klass A. Hur ska man implementera för att A:s destruktor inte ska exekveras när B:s destruktor kallas?

class A { . . . ~A() { cout << "A:s destruktor" << endl; } }; class B : public A { . . . ~B() { cout << "B:s destruktor" << endl; } };

Om jag alltså förstör en instans av B i exemplet ovan, så vill jag att endast "B:s destruktor" ska skrivas ut.

Edit:

Går detta ens att göra? Enda lösningen jag kommer på är att deklarera en extra "virtual" method som destruktorn kallar på och som gör allt den annars skulle göra.

Permalänk
Medlem

C++ är lite roligt... du måste deklarera destruktorn som virtuell för att den skall köra den ärvda klassens destruktor.

class A { . . . virtual ~A() { cout << "A:s destruktor" << endl; } }; class B : public A { . . . ~B() { cout << "B:s destruktor" << endl; } };

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Jag är lite osäker på om det faktiskt är som du säger. Vad jag förstått gäller följande:

Antag att klass B ärver klass A.

Om A:s destruktor inte är virtual så kallas endast A:s destruktor när man förstör en instans av klass B.

Om A:s destruktor är virtual så kallas först B:s destruktor och sedan A:s destruktor när man förstör en instans av klass B.

Destruktors funkar alltså inte riktigt på samma sätt som vanliga metoder vid arv.

Edit: Vid närmare eftertanke så stämmer ju det som du skrev, men vad jag var ute efter var att endast B:s destruktor skulle kallas och inte A:s.

Jag löste det i alla fall genom att skapa en basklass som både A och B ärver.

Permalänk
Medlem

doh! tänkte lite fel när jag läste din fråga. oftast brukar det frågas efter varför klass Bs destruktor inte körs, så det var det jag svarade på av bara farten...

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Nu valde du att lösa problemet på ett vettigt sätt (redesign), annars så kan man väl hacka basklassens destruktor med något som liknar:

if (typeid(this) != typeid(A)) return

Permalänk
Hedersmedlem

Usch vad längesen det var jag jobbade i C++. Borde man inte i A-klassens destruktor kunna testa om this är av typen A eller B och om den är av B, bara returnera? Detta borde funka med hjälp av RTTI.

Edit: Jag ser att Bobby hann före

Permalänk

Grejen är att jag kodar för Symbian (borde jag kanske ha nämnt tidigare...). Från och med v9 finns visserligen stöd för RTTI, men jag måste även ha kompatibilitet med äldre versioner.

Som sagt så löste jag det redan, men tack i alla fall! Alltid roligt att diskutera olika lösningar.