Konwersja obiektów klasy bazowej do pochodnej.

0

Mam dwie klasy, CCzlowiek i CStudent. CStudent jest pochodna klasy CCzlowiek (wiadomo),

Jerzeli stworze nowy obiekt CCzlowiek dajmy na to "Osoba" i przypisze do niego obiekt klasy CStudent Janek, to jest wszystko okey, i Osoba ma wypelnione odpowiednie zmienne wartosciami obiektu Janek.

Natomiast kiedy chce zrobic na odwrot, czyli do nowego obiektu klasy CStudent przypisac obiekt klasy bazowej to wyrzuca mi blad

Error	1	error C2440: 'initializing' : cannot convert from 'CCzlowiek' to 'CStudent'	
CStudent Janek;
Janek.Dane(); // wypelniamy obiekt


CCzlowiek Osoba = Janek; // przypisujemy bazowy = pochodny
Osoba.Print();

CStudent Drugi = Osoba; // proboje przypisac pochodny = bazowy, ale nie moge

Dziwi mnie to, bo na logike jezeli juz to powinno byc na odwrot.

Pozdrawiam

0

Przypisanie CCzlowiek = CStudent jest w porządku dopóki nie zaczną małpy na uczelnie przyjmować.
Natomiast przypisanie CStudent = CCzlowiek nie musi zadziałać bo ten CCzłowiek może być na przykład CNoworodek - za młody jak na studenta, albo CCzłowiek może być na przykład CCzłowiekSlawnyNieZyjacy - zbyt martwy jak na studenta.

0

Każdy Student jest (is-a, dziedziczenie) Człowiekiem - z tego powodu to pierwsze przypisanie w C++ się udaje. Nazywa się to object slicing - jest to rzutowanie "w górę" i zachodzi niejawnie.

Natomiast Człowiek nie jest Studentem - przypisanie w drugą stronę nie ma za bardzo sensu. No bo po takim przypisaniu jakie będą te części Studenta, których nie ma w Człowieku? Oczywiście to nie oznacza, że nie można tego zrobić. Błąd kompilacji wynika z tego, że operator przypisania z klasy bazowej jest przesłaniany przez operator przypisania klasy pochodnej i nie jest brany pod uwagę przy przypisaniu. Musisz dopisać operator w klasie pochodnej, który przyjmie klasę bazową i będzie robił coś rozsądnego z tymi częściami, których nie ma.

class Base {
    
};

class Derived : public Base {
public:
  Derived &operator=(const Base &) {
    return *this;      
  }
};

int main() {
  Base b;
  Derived d;
  
  // To działa normalne.
  b = d;
  
  // Tutaj potrzeba operatora.
  d = b;
	
  return 0;
}

http://ideone.com/jJyUtb

0

Dzięki panowie za wyjaśnienie, myślałem ze podstawowy operator przypisania po prostu kopiuje cześć wspólną dla obiektów, a resztę pozostawia niezainicjalizowaną, no ale tak nie jest.

1 użytkowników online, w tym zalogowanych: 0, gości: 1