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

Dziedziczenie - konstruktory, destruktory

Object Storage Arubacloud
0 głosów
302 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez evergreen Użytkownik (680 p.)
edycja 16 stycznia 2016 przez evergreen
Mam klasy A, B, C, D. A - kl. bazowa.B dziedziczy virtual protected A. C dziedziczy virtual public A. D dziedziczy publicznie B i prywatnie C.

Tworząc obiekt D za pomocą konstruktora sparametryzowanego uruchamia się konstruktor domyślny kl. bazowej A, zamiast sparametryzowanego, dlaczego?

D::D(double x, double y, string z) : B(x,y,z) { "konstr sparam klasy D" }

C::C(double x, double y) : A(x,y) {"konstr sparam klasy C"}

B::B(double x, double y, string z) : A(x,y), zmienna(z) { "konstr sparam klasy B" }

A::A(double x, double y) : a(x), b(y) { "konstr sparam klasy A" }

Moje 2 pytanie: jeśli dziedziczymy po jakiejś klasie to czy w każdym konstruktorze domyślny, kopiującym i sparametryzowanym należy wywołać również konstruktor klasy bazowej? Czy tylko w kopiujacym i sparametryzowanym? I jak z destruktorami?

3 odpowiedzi

0 głosów
odpowiedź 16 stycznia 2016 przez Ada Pieńkowska Początkujący (340 p.)
No musisz jakoś zainicjalizować zmienne w A, a jeżeli dziedziczysz publicznie to jedynie przez konstruktor jest to możliwe.
0 głosów
odpowiedź 16 stycznia 2016 przez criss Mędrzec (172,590 p.)
Domyślny sam zostanie wywołany, więc nie - nie musisz.

Co do 1 pytania - rozrysowałem to sobie i, jeśli wszystko dobrze napisałeś, to nie mam pojęcia dlaczego :| Najlepiej pokaż kod.
komentarz 16 stycznia 2016 przez evergreen Użytkownik (680 p.)
Dopisałem do konstruktora klasy D wywołania konstruktorów na liście inicjalizacyjnej klas B, C, A i działa. Wygląda na to, że tworząc obiekt klasy najbardziej pochodnej i dziedzicząc wirtualnie muszę użyć również konstruktora klasy bazowej.
komentarz 16 stycznia 2016 przez criss Mędrzec (172,590 p.)
Nie wiem czy to nie jest rozwiązanie "na chama", no ale cóż - nie mam innego pomysłu teraz.
0 głosów
odpowiedź 16 stycznia 2016 przez draghan VIP (106,230 p.)

Tworząc obiekt D za pomocą konstruktora sparametryzowanego uruchamia się konstruktor domyślny kl. bazowej A, zamiast sparametryzowanego, dlaczego?

A że tak zapytam: czy Ty wywołujesz ów sparametryzowany konstruktor? Jeśli nie, to skąd kompilator ma się dowiedzieć, jakie argumenty chcesz przekazać konstruktorowi? Zawsze, jeśli tego nie sprecyzujesz, wywoła się c-tor domyślny. Zauważ, że jeśli zadeklarujesz parametryzowany konstruktor ze wszystkimi argumentami domyślnymi, to taki c-tor również jest traktowany jak domyślny.

jeśli dziedziczymy po jakiejś klasie to czy w każdym konstruktorze domyślny, kopiującym i sparametryzowanym należy wywołać również konstruktor klasy bazowej? Czy tylko w kopiujacym i sparametryzowanym? I jak z destruktorami?

...jeśli odpowiada Ci działanie konstruktorów domyślnych, to nie wywołuj - zostaną wywołane bez pytania o zgodę. Jeśli zaś chcesz je sparametryzować, to musisz samodzielnie sprecyzować takie wywołanie.

Klasa bazowa powinna posiadać wirtualny destruktor, żeby przy niszczeniu obiektów pochodnych wywołał się również destruktor bazowy.

Podobne pytania

0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
0 głosów
1 odpowiedź 478 wizyt
pytanie zadane 30 kwietnia 2018 w Java przez Adrian Paź Obywatel (1,270 p.)
0 głosów
1 odpowiedź 354 wizyt

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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!

...