• 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ć?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
191 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ź 199 wizyt
pytanie zadane 20 maja 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 577 wizyt
0 głosów
2 odpowiedzi 814 wizyt
pytanie zadane 22 marca 2020 w C i C++ przez wall7489 Obywatel (1,280 p.)

93,158 zapytań

142,171 odpowiedzi

321,881 komentarzy

62,487 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 224p. - nidomika
  2. 224p. - Marcin Putra
  3. 223p. - dia-Chann
  4. 221p. - ssynowiec
  5. 217p. - Mikbac
  6. 216p. - CC PL
  7. 215p. - Łukasz Piwowar
  8. 212p. - zmmz89
  9. 210p. - Adrian Wieprzkowicz
  10. 208p. - rafalszastok
  11. 206p. - Michal Drewniak
  12. 204p. - Łukasz Eckert
  13. 202p. - rucin93
  14. 200p. - robwarsz
  15. 198p. - TheLukaszNs
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...