Ech,
Slynx, czytaj i analizuj to, co do Ciebie piszę! Przecież
w tym poscie napisałem, że taka konstrukcja jest błędna. Ty próbujesz obiekt klasy
A potraktować jak obiekt klasy
B. A to błąd, ponieważ tu nie zachodzi konwersja obiektu typu
A na
B, jedynie konwersja wskaźnika
A* na
B* (w Twoim przypadku o uchwyty chodzi), zatem zmieniasz jedynie interpretację tego samego skrawka pamięci. Więc jeśli tworzysz obiekt klasy
A i zaczynasz interpretować go jako obiekt klasy
B, to to jest błąd. Z kolei jeśli stworzysz obiekt klasy
B i zaczniesz go interpretować jako obiekt klasy
A, to jest ok, ponieważ w skład obiektu klasy
B wchodzi klasa
A - wynika to z dziedziczenia. Mam nadzieję, że to jest teraz zrozumiałe.
Wystarczy, że zrobisz tak:
TBase^ GetBaseObject()
{
TBase^ output = gcnew TDerived();
// uzupelniamy część pól...
return output;
}
i problem powinien zniknąć.