Cześć,
Wątek zakładam, ponieważ chcę zrozumieć po co tak naprawdę jest rzutowanie w górę i w dół hierarchii
Wiem następujące rzeczy:
- Aby rzutowanie można było wykonać to obiekty muszą dziedziczyć po jednej klasie bazowej (najprostszy przypadek),
- Rzutowanie służy po to aby móc się dobrać do metod klasy bazowej lub pochodnej - tj w zależności w którą stronę hierarchii wykonujemy rzutowanie,
- Klasy muszą zawierać metody wirtualne - dotyczy to rzutowania wskaźników metodą
dynamic_cast
, natomiaststatic_cast
obiekty muszą być statyczne tj. nie mogą to być wskaźniki - Prawda jest taka, że rzutowanie nie zmienia typu obiektu i jego właściwości, jest to tak jakby inna etykieta obiektu - coś w rodzaju referencji ?
Sugerowałem się następującymi wątkami rzutowanie w górę i w dół oraz tym tematem
W odpowiedziach chciałbym się dowiedzieć następujących rzeczy:
- gdy wykonuję rzutowanie, to w jaki sposób można się dobrać do metod klasy bazowej lub pochodnej ? - w zależności od kierunku rzutowania - Prosiłbym o przykłady
- Czemu rzutowanie ma służyć ? Prosiłbym o jakieś przykłady i wyjaśnienie
- Zrobiłem sobie taki przykład:
#include <iostream>
#include <string>
using namespace std;
class osoba{
public:
osoba(void){_imie="pusty"; _nazwisko="pusty";}
osoba(string imie, string nazwisko):_imie(imie), _nazwisko(nazwisko){}
inline void pokaz(void){
std::cout << _imie << " " << _nazwisko << std::endl;
}
string _imie;
string _nazwisko;
};
class menedzer : public osoba{
public:
menedzer(string imie, string nazwisko):osoba(imie, nazwisko){}
};
class robol : public osoba{
public:
robol(string imie, string nazwisko, menedzer *szef):osoba(imie,nazwisko){
_szef=szef;
}
menedzer *_szef;
menedzer *ktoJestSzefemRobola(){
return _szef;
}
};
void premia(osoba &os){
std::cout << "Gratulacje !!! dostajesz premie !!! -> ";
os.pokaz();
}
int main(void)
{
menedzer m("jajcarz","fajny");
robol r("silny","twardziel",&m);
// std::cout << r.ktoJestSzefemRobola()->_nazwisko;
std::cout << std::endl;
osoba o("xx","zz");
// r = static_cast<robol&>(o); // <- odkomentuj ten kawałek i skompiluj
// std::cout << "dane robola - ";
// r.pokaz();
o = static_cast<osoba&>(r);
std::cout << "dane osoby - ";
o.pokaz();
// std::cout << "dane robola - " << r._imie << " " << r._nazwisko;
// std::cout << std::endl;
// premia(r);
std::cout << std::endl;
return 0;
}
W powyższym przykładzie wystarczy odkomentować jedną linię która jest opisana komentarzem i pokazuje istotę rzutowania ale nie wiem:
- czy ten przykład jest prawidłowy ?,
- jakie wnioski z niego wyciągnąć ?
Czemu drążę temat rzutowania ? Bo chcę zrozumieć, czemu to używać, po co i w jakich sytuacjach ? Ponieważ w Qt robią takie rzutowanie i nie wiem dlaczego...
void MyDateEditDelegateCol5Tab0::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QDate value = index.model()->data(index, Qt::EditRole).toDate().currentDate();
QDateEdit *DateEdit = static_cast<QDateEdit *>(editor);
DateEdit->setDate(value);
}
Będę wdzięczny za pomoc w zrozumieniu tematu