• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rzutowanie klas - dynamic_cast a static_cast

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
2,806 wizyt
pytanie zadane 13 kwietnia 2015 w C i C++ przez arkus Bywalec (2,160 p.)

Witam.

Może mi ktoś wyjaśnić czym różni się rzutowanie dynamic_cast od static_cast?

Mam tutaj np. jedna funkcję, która używa dynamic :

(Student i Pracownik dziedziczą z klasy Osoba)

void wypiszDaneOsoby(Osoba * wskOsoba) {
        
        Student * tempStudent = dynamic_cast<Student*> (wskOsoba);
        if (tempStudent != NULL) {
                cout << "Student: ";
        } else {
                Pracownik * tempPracownik = dynamic_cast<Pracownik*> (wskOsoba);        
                if (tempPracownik != NULL) {
                        cout << "Pracownik: ";
                } else {
                        cout << "Blad podczas dzialania programu";
                }
        }


   cout << wskOsoba->podajImie()
            << " "
            << wskOsoba->podajNazwisko()
            << " wydatek osobowy: "
            << wskOsoba->wydatekOsobowy()
            << "\n";
}

a tu static:

void ustalStypendiumStudenta(int nr, int stypendium) {
        Student * tempStudent = static_cast<Student*> (tablicaOsob[nr]);
        tempStudent->ustalStypendium(stypendium);
}

Rozumiem, że w pierwszej funkcji mogę dowiedzieć się czy dany wskaźnik wskazuje na obiekt klasy Student czy Pracownik. A do czegu użyty jest static_cast w drugiej funkcji?

1 odpowiedź

+4 głosów
odpowiedź 13 kwietnia 2015 przez szmq Pasjonat (22,770 p.)
wybrane 13 kwietnia 2015 przez arkus
 
Najlepsza

1. static_cast

Najbardziej przydatny, używaj do:

  • rzutowania kompatybilnych typów i wskaźników, np. double -> intlong -> char, int* -> void*

Przykład:

int main()
{
	const double PI = 3.14159265358979323846264279502;
	int integer_pi = static_cast<int>(PI);

	 . . . 
	return 0;
}

2. dynamic_cast

Używaj do rzutowania wskaźników bazowych na pochodne (w dół hierarchii dziedziczenia), gdy nie jesteś pewien kompatybilności typów (czyli że takie rzutowanie rzeczywiście ma sens). W razie niekompatybilności:

  • zwróci wartość NULL, w przypadku rzutowania wskaźników
  • rzuci wyjątek std::bad_cast, w przypadku rzutowania referencji

Możesz w ten sposób sprawdzić, czy obiekt należy do danej klasy.

Przykład:

class Car {};

class Honda : public Car {};

int main()
{
	Car *car = new Honda();
	Honda *honda = dynamic_cast<Honda*>(car);

	 . . . 
	delete honda;
	return 0;
}

Reszta: 

http://www.mateuszmidor.com/2011/05/static_cast-vs-dynamic_cast-vs-reinterpret_cast-vs-const_cast/

Podobne pytania

0 głosów
1 odpowiedź 505 wizyt
pytanie zadane 29 kwietnia 2018 w C# przez DODO Bywalec (2,950 p.)
0 głosów
3 odpowiedzi 1,478 wizyt
pytanie zadane 3 listopada 2017 w C i C++ przez Avernis Nałogowiec (27,400 p.)
+1 głos
5 odpowiedzi 1,422 wizyt
pytanie zadane 27 kwietnia 2015 w C i C++ przez aspoka Mądrala (5,290 p.)

93,443 zapytań

142,434 odpowiedzi

322,691 komentarzy

62,805 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...