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

operator przypisania virtualny - jak to dobrze wykonać?

Object Storage Arubacloud
0 głosów
165 wizyt
pytanie zadane 19 czerwca 2017 w C i C++ przez Rivit Nowicjusz (200 p.)
Witam.

Przerabiam sobie zadania z "Szkoły programowania". Natknąłem się na jedno zadanie i nie wiem czy dobrze je wykonałem. Mianowicie chodzi o operator=. Czy tak ja zrobiłem ja (czyli jako virtualny) jest dobrze? Jeżeli nie to co tam jest nie tak?

Dołączam kody:

cd.h

http://wklej.org/id/3204848/

 

cd.cpp

http://wklej.org/id/3204850/

 

classic.h

http://wklej.org/id/3204851/

 

classic.cpp

http://wklej.org/id/3204852/

 

main.cpp

http://wklej.org/id/3204853/

 

Dziękuję, pozdrawiam!

1 odpowiedź

0 głosów
odpowiedź 20 czerwca 2017 przez criss Mędrzec (172,590 p.)
wybrane 20 czerwca 2017 przez Rivit
 
Najlepsza
Nie wiem na czym polegało zadanie, ani co książka mówi na ten temat, ale:

Dodanie virtual w twoim kodzie nic nie zmienia (poza tym, że kompilator ma troche więcej roboty i tworzy się więcej kodu maszynowego). Zauważ, że w obu klasach operatory przypisania wyglądają nieco inaczej. Oba zwracają i przyjmują referencje na swój typ (dziwnie to brzmi, ale myśle, że wiadomo o co chodzi). Cały mechanizm nadpisywania metod zadziała jeśli deklaracja metod w obu klasach (bazowej i pochodnej) nie różni się. Tutaj masz po prostu dwie różne metody. I tak - Classic ma dwa operatory przypisania. Jeden (odziedziczony) zadziała dla obiektów Cd, a drugi dla obiektów Classic (pierwszy wariant też by "pasował", ale kompilator wybiera bardziej restrykcyjny wariant). W uproszczeniu, bo Classic::operator=(const Cd &) uruchomi się też gdy dostanie referencje na Cd wskazującą jednak na obiekt Classic.

Także koniec końców virtual tutaj mija się z celem. Rozwiązaniem byłoby oczywiście zamienienie operatora z Classic na taki sam jak w klasie bazowej - wtedy overriding zadziała. Tylko, że to cię ogranicza (operator nie wie jakiego typu obiekt dostał). To możesz obejść testując typ dynamic_castem, ale to z kolei jest czasochłonne (bo RTTI). Tutaj już dość indywidualna decyzja, ale nie wygląda to najpiękniej. Szczerze mówiąc nie wiem jak się rozwiązuje ten problem, ale wydaje mi się, że po prostu się tego nie robi (nigdzie jeszcze nie widziałem wirtualnego operatora przypisania i sam też nigdy nie miałem potrzeby tworzyć takiego).

Mam nadzieję, że nie zagmatwałem (wydaje mi się, że jednak tak :D). Jeśli coś jest niejasne, chętnie wytłumacze :)
komentarz 20 czerwca 2017 przez Rivit Nowicjusz (200 p.)
Tak, chyba masz racje. Skoro operatory przypisania się różnią to po co robić z niego virtual.

 

Dzięki :D

Podobne pytania

0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 20 maja 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 488 wizyt
0 głosów
2 odpowiedzi 569 wizyt
pytanie zadane 22 marca 2020 w C i C++ przez wall7489 Obywatel (1,250 p.)

92,632 zapytań

141,502 odpowiedzi

319,883 komentarzy

62,015 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...