Jó így a memória foglalásom (c++)?
Van két osztályom egy ősosztály és egy gyerek osztály.
Helyet szeretnék foglalni nekik.
Akkor, ha ezt írom a main.cpp-be az jó?
Sportolo *s1 = new Sportolo;
Futo *f1 = new Futo;
(A sportolo az ős.)
Így szabadítom fel:
delete s1;
delete f1;
Nem sikerült a legjobban feltenni a kérdést.
Nem derül ki, hogy azt szeretnéd-e tenni, amit a kód csinál, vagy csak félreértetted az öröklődést egy kicsit.
1. Ha szeretnél külön egy sportolót és külön(!) egy futót (ami egyúttal egy újabb sportoló is), akkor jó. Tehát ha mindkettőből szeretnél egy-egy példányt, akkor jó a kódod.
2. Ha csak egy futót szeretnél, aki egyben sportoló is, akkor a "new Sportolo" és "delete s1" tartalmú sorok feleslegesek, mert a Futo automatikusan Sportolo is.
#4:
Ez így nem egészen igaz. Az igaz hogy a kettő nem mindig ugyan az, de osztály és szabvány függő hogy melyik mit csinál. Általában ha van default konstruktor, mind a kettő meghívja azt. Ajánlom figyelmedbe a követező oldalt:
Igen, tudom, hogy nem teljesen van így, de figyelembe véve, hogy nem ismerjük az osztályok struktúráját biztonságosabb azt mondani, hogy nem inicializál semmit, és legfeljebb tévedni, mint nem mondani semmit :D
Meg egyébiránt ez pont egy olyan része a nyelvnek, amit nem sikerült még teljesen a fejembe vésnem.
A memóriáról látom eddig nem volt szó... A mintában mindkét destruktor virtuális. Ez azért fontos mert, így az ősOsztálynak lefoglalt terület is felszabadúl, egyébként nem.
( A konstruktor és dest. azért írki ezt azt, hogy látszódjon mikor melyik fut le -> megfigyelhető, hogy míg az obijektum létrehozásakor ( = new Futo; ) a Sportolót követi a Futó; a megsemmisüléskor (delete senki / delete Bela) előbb a Futó, majd a Sportoló dest. fut le. )
Tanulság, a destruktorod mindig legyen virtuális. :) Baj nem lesz belőle várhatóan.
#include <iostream>
class Sportolo{
public:
Sportolo() {
std::cout << "Sportoló kész.\n";
}
virtual ~Sportolo() {
std::cout << "Sportoló törölve.\n";
}
};
class Futo : public Sportolo{
public:
Futo() {
std::cout << "Futó kész.\n";
}
virtual ~Futo(){
std::cout << "Futó törölve.\n";
}
};
int main()
{
Sportolo* valaki = new Sportolo;
Sportolo* senki = new Futo;
Futo* Bela = new Futo;
delete valaki;
delete senki;
delete Bela;
std::cout << "Vége\n";
return 0;
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!