Portál AbcLinuxu, 27. října 2025 17:41
dobrý den,
Měl bych dotaz.
Vytvořil jsem si jednu třídu CZamestnanci a 2 potomky CVojak a COz.
vytvořil jsem si pole objektů třídy CZamestnanec :
CZamestnanec *lide[100];
nyní bych chtěl vytvářet objekty (potomky) CVojak a COz
pokud vsak vytvorim objekt takto : lide[0] = new CVojak tak objekt lide[0] je stále třídy CZamestanci.
Nevíte jak to udělat tak aby mohl vytvářet prvky pole třídy CVojak nebo COz podle toho jaky typ zrovna chci?
děkuji za odpověď
Disclaimer: v C++ som nikdy nič užitočné nenaprogramoval a vedomosti mám viacmenej len zo školy, takže tento komentár berte s rezervou.
K Tvojmu problému: pokiaľ viem, tak on to je CVojak, ale tým že k nemu pristupuješ cez typ CZamestnanec *, tak s ním môžeš robiť len ako s CZamestnancom. Keď chceš volať metódy zdedených tried, tak tie metódy musia byť virtual a keď chceš prístupiť k dátam toho CVojaka, tak to jedine, že si ten smerník predtým pretypuješ.
#include <iostream>
using namespace std;
class Zamestnanec{
public:
void setNazev(){cout << "Nazev";}
void setJidlo(){cout << "Jidlo";};
};
class Debil : public Zamestnanec{
public:
void setZadrz(){cout << "Zadrz";};
};
class Kokot : public Zamestnanec{
public:
void setOjeb(){cout << "Ojeb";};
};
int main(int argc, char** argv)
{
Zamestnanec *pole[100];
pole[0] = (Debil*) new Debil();
pole[1] = new Kokot();
((Debil*)pole[0])->setZadrz();
return 0;
}
Děkujimoc. Zachránil jsi mi život...Tohle funguje bezvadně 
To možná jo, ale já jsem příliš velkej začátečník abych věděl co to je
. Tak například vector by se dal použít takto:
#include <iostream>
#include <vector>
using namespace std;
class Zamestnanec{
public:
void setNazev(){cout << "Nazev";}
void setJidlo(){cout << "Jidlo";};
};
class Debil : public Zamestnanec{
public:
Debil(int d){
this->data=d;
}
void setZadrz(){cout << this->data;}
private:
int data;
};
class Kokot : public Zamestnanec{
public:
void setOjeb(){cout << "Ojeb";};
private:
int data;
};
int main(int argc, char** argv)
{
vector<Zamestnanec*> pole;
pole.push_back((Debil*) new Debil(5));
pole.push_back(new Kokot());
((Debil*)pole.at(0))->setZadrz();
return 0;
}
Výhodou je to že nejsi omezenej na staticky určený počet zaměstnancú.
. Třeba bude mít štěstí
class Zamest {
public:
virtual void setNazev() = 0;
virtual int plat() = 0;
void spolecne_veci(parametry..);
}
class Programator : public Zamest{
public:
void setNazev() { cout << "aaaaaaaaa"; }
int plat() { return 10000000; }
.......
}
class Uklizecka : public Zamest {
public:
void setNazev() { cout << "bbbbbbb"; }
int plat() { return 5; }
.........
}
............
Zamest *pole[100];
pole[0] = new Uklizecka();
......
Takto bych to řesil já
Ach jo, jak vidim na blbou otazku, blbe odpovedi... Proboha lidi, kdyz uz se pta zacatecnik, tak mu poradte tak, aby mu to alespon k necemu bylo!
Pokud bych se mel drzet zadani a prihlednu ke stavajicim odpovedim, tak to uz muzete rovnou pouzit toto (radsi explicitne rikam: TAKTO NE!):
void* pole[SIZE]; pole[0] = new Jenicek; pole[1] = new Marenka; ((Jenicek*) pole[0])->vidimSvetylkoVDali((*Marenka)pole[1]);
Divim se, ze se nikdo nezeptal, jak a proc se k jednotlivym prvkum bude pristupovat. Pokud cilem je pouze volat virtualni metody prvku kontejneru, tak je naprosto zbytecne toto vubec resit. Pokud je nutne k jednotlivym prvkum pristupovat odlisne v zavislosti na jejich typu (predpokladam, ze jsou to ruzni potomci jednoho predka), tak to znamena spatny navrh a problem by mel byt vyresen jinak (s vyuzitim virtualnich metod).
Pokud se tomu opravdu nejde vyhnout, tak pro pretypovani predka na potomka se pouziva dynamic_cast (coz je dle meho nazoru prasarna, ale to je opravdu pouze muj nazor), ktere zarucuje typovou kontrolu, takze reseni by vypadalo asi takto.
class BlbecVlese { virtual ~BlbecVLese() {} };
class Jenicek : public BlbecVlese {...};
class Marenka : public BlbecVLese {...};
...
BLbecVLese* blbci[100];
blbci[0] = new Jenicek;
blbci[1] = new Marenka;
...
BlbecVLese* x = blbci[y]; //predpokladany predek
Jenicek* j = 0;
Marenka* m = 0;
if ( 0 != (j = dynamic_cast<Jenicek*>(x)) )
j->vylezNaStrom();
else if ( 0 != (m = dynamic_cast<Marenka*>(x)) )
m->pockejPodStromem();
else
{
jezibaba->sezer(x);
throw kosti;
}
...
Omlouvam se za konfliktni ton... Nechci rozpoutavat flame. Jen si myslim, ze rady zacatecnikovy by nemely byt ve smyslu: "chci udelat prasarnu => nekdo mi poradi jeste vetsi prasarnu jak to realizovat" 
. No tak když ono to svádělo mu tak poradit
. Jinak plně souhlasím stím že bude špatně navrženej už koncept. A dost pochybuji, že jako začátečník by se měl zaobírat věcmi jako dynamic_cast.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.