Na samym początku zastosowałem standardowe rzutowanie z C, czyli:
TDerieved^ derObject = (TDerieved^ )GetBaseClassObject(someObject);
Potem szybko przeleciałem po internecie i znalazłem, że obiekt klasy bazowej na pochodną powinno się rzutować właśnie w ten sposób lub za pomocą static_cast.
Więc wrzuciłem static_cast:
TDerieved^ derObject = static_cast<TDerieved^ >(GetBaseClassObject(someObject));
Uruchomiłem i wszystko kompletnie się zawiesiło. Procesor nie obciążony, z pamięcią też nie chulał. Mimo, że był standardowo w trybie debuggowania, nie mogłem go zatrzymać / wyłączyć. Zawiesił również Visuala ( co zdarzyło mi się pierwszy raz by aplikacja w trybie debuggowania zawiesiła środowisko). Nie chcę dalej kombinować, bo nie jestem, aż tak zaznajomiony z tematem rzutowania.
Przy okazji jeszcze jeden problem z rzutowaniem (tamten wystąpił podczas ładowania zadań, ten podczas ładowania ustawień, więc Log programu zaczął świecić na czerwono;p).
Chodzi o rzutowanie obiektu na typ String. Mam taki kod:
Void TSettings::AddValue(Object^ key, Object^ value)
{
if (!_settings->ContainsKey((String^)key))
{
_settings->Add((String^)key, (String^)value);
}
else
{
_settings[(String^)key] = (String^)value;
}
};
Klucz (key) może być jedną z 6 klas enum oraz typem String, wartość (value) String, Boolean lub int. Więc żeby nie robić masy funkcji, chciałem podawać argumenty typem Object. Wiem, że można to zapisać
I (mam nadzieję) działa poprawnie, ale chciałem tak jak w pierwszym kodzie, bo hmm... lepiej wygląda.
----------
Ok, ok. Co do drugiego to już rozumiem. Object jest klasą bazową dla tych typów, ale przy konwersji obiekt jest traktowany pod typem jaki powstał, tj. Jako, że klas enumerycznych rzutować na String^ nie można to nic nie zmieni, że ja sprowadzę to do Object, to nadal klasa enumeryczna
---------
Ehem, już wiem dlaczego static_cast spowodował taki katastrofalny błąd, a dlaczego dynamic_cast spowodował jedynie błąd w Logu programu - NullReference. Ale nadal nie wiem czemu nie mogę zrzutować klasy bazowej do pochodnej.






