_13th_Dragon napisał(a)
Jeżeli zaś zachodzi dziedziczenie wielobazowe i/lub wirtualne to wtedy konieczne jest dynamic_cast (wymaga posiadania przynajmniej jednej metody wirtualnej, przez klasę bazową oraz klasę pochodną)
dynamic_cast jest potrzebne tylko wtedy, gdy w danej fazie programu nie masz pewności co do rzutowanego typu i chcesz dokonać jego sprawdzenia w trakcie konwersji.
AdamMC napisał(a)
Tak, w moim kodzie klasa1 dziedziczy jeszcze po slist z __gnu_cxx. Może jednak spróbujesz?
Skąd się bierze różnica między static_cast a reinterpret_cast?
Jeśli masz dziedziczenie wielobazowe, to w przypadku przypisania adresu obiektu do wskaźnika na typ bazowy, zapamietywany jest nie wskaźnik do całej struktury, ale wskaźnik do odpowiedniego fragmentu klasy, więc binarna wartość wskaźnika może niejawne otrzymać odpowiednie przesunięcie (offset).
Takie rozwiązanie jest konieczne by za pomocą tego wskaźnika prawidłowo obsługiwać inne klasy, które również rozszerzają tą klasę bazową i typ bazowy jest umieszczony w pamięci obiektu o innym typie w nico innym miejscu (offset).
W momencie użycia static_cast te dodatkowe przesuniecie jest brane pod uwagę i odwracane, wiec konwersja zachodzi prawidłowo, w przypadku reinterpret_cast adres interpretowany jest dosłownie i przesunięcie to jest ignorowane (jeśli istnieje takie przesuniecie prowadzi to do błędu).
W momencie, gdy przypisałeś wskaźnik na typ void* zapamiętujesz wskaźnik do całości klasy (zapominając jedynie o pierwotnym typie), więc reinterpret_cast zadziałało prawidłowo.