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

Konstruktor klasy pochodnej.

Hosting forpsi easy 1 pln
0 głosów
846 wizyt
pytanie zadane 17 lutego 2017 w C i C++ przez Miszo Bywalec (2,100 p.)
edycja 17 lutego 2017 przez Miszo

Dlaczego przy konstruktorze w klasie pochodnej na liście inicjalizacyjnej wywyołujemy konstruktor klasy podstawowej bez operatora zakresu ::

A w przypadku operatora= w ciele funkcji musimy już zastosować operator zakresu bo operator= jest zasłonięty?

 

Class A {
public:
A{}
~A{}

}

Class B : public A {

B{} : A()



}

B & operator=(B & wzor){

*this.A::operator=(wzor) 

}

 

komentarz 17 lutego 2017 przez Patrycjerz Mędrzec (192,340 p.)
Na serio sądzisz, że ten kod się skompiluje? Tak w ogóle operatora zasięgu używamy zawsze w sytuacji, gdy kompilator nie jest pewny, do jakiej przestrzeni należy wywoływany obiekt (zmienna, funkcja itp.).
komentarz 17 lutego 2017 przez Miszo Bywalec (2,100 p.)
To co odziedziczony konstruktor klasy A jest w zakresie klasy B, a operator= nie jest? Dlaczego nie?
1
komentarz 17 lutego 2017 przez Patrycjerz Mędrzec (192,340 p.)

O czym my w ogóle rozmawiamy? Przecież w twoim kodzie klasa A nie posiada żadnego operatora. Zapisem A::operator=(wzor) wywołujesz operator, który nie istnieje.

komentarz 17 lutego 2017 przez criss Mędrzec (172,590 p.)
Kopiujacy  (i przenoszacy też) operator przypisania jest automatycznie generowany przez kompilator, wiec istnieje  (o ile doprowadzimy ten kod do ładu).
komentarz 18 lutego 2017 przez Patrycjerz Mędrzec (192,340 p.)
No tak, ale operator przypisania i tak posiada argument tej samej klasy, do której należy, więc wnioskowałem, że chodzi o przeciążony operator, którego nie ma.
komentarz 18 lutego 2017 przez Miszo Bywalec (2,100 p.)
Nie mówię przecież, że nie istnieją. Tylko ja chce swoje stworzyć. I przy tworzeniu owych muszę wywołać:

konstruktor  klasy A dla kostruktora z klasy pochodnej B

operator przypisania klasy A dla operatora przypisania B

przy konstruktorze B() w liście piszę A(), a w ciele funkcji przypisania klasy pochodnej B *this.A::operator=(wzor)

Pytanie dlaczego *this.A::operator=(wzor), a nie *this.operator=(wzor)

albo

dlaczego A() : B() , a nie A(): B:B()
komentarz 18 lutego 2017 przez Patrycjerz Mędrzec (192,340 p.)

Pokaż nam najpierw sensowny kod, to pogadamy. Trudno wywnioskować, jakby miał działać (lub w ogóle działać) ten operator, bo nie mamy żadnego punktu odniesienia.

Jeśli chodzi o drugie pytanie, to w liście inicjalizacyjnej mogą występować jedynie składowe klasy, w której konstruktorze jest wywoływana lista oraz konstruktory klas bazowych. Wynika więc z tego, że operator zasięgu jest zbędny przy wywołaniu konstruktora klasy bazowej, gdyż kompilator ma jasno określone klasy bazowe i ich konstruktory. Jak wcześniej mówiliśmy, operatora :: używa się jedynie wtedy, gdy nie jest sprecyzowane, do jakiej przestrzeni należy dany obiekt.

komentarz 18 lutego 2017 przez Miszo Bywalec (2,100 p.)
Ok, rozumiem.

Przy wywołaniu funkcji przypisania klasy A na rzecz obiektu klasy B trzeba zastosować operator zakresu :: ponieważ odziedziczona z klasy A funkcja przypisania operator=() jest przysłania przez tą moją stworzoną.

Przy wywołaniu konstruktorów klas podstawowych w liście inicjalizacyjnej kostruktora klasy pochodnej nie trzeba żadnego kwalifikatora, ponieważ konstruktor A() klasy podstawowej jest odziedziczony i nie jest przez nic przysłaniany.
1
komentarz 18 lutego 2017 przez criss Mędrzec (172,590 p.)

No tak, ale operator przypisania i tak posiada argument tej samej klasy, do której należy, więc wnioskowałem, że chodzi o przeciążony operator, którego nie ma.

Referencje też podlegają zasadom polimorfizmu, więc nie ma problemu, żeby napisać tak:

class A {};
class B : public A {};

B b;
A & ref = b;

Tym samym kopiujący operator przypisania klasy bazowej jest w stanie przyjąć obiekty wszystkich klas pochodnych.

1 odpowiedź

+2 głosów
odpowiedź 17 lutego 2017 przez criss Mędrzec (172,590 p.)
wybrane 17 lutego 2017 przez Miszo
 
Najlepsza
Twój kod to jakas tragedia. Nawet nie ma szans zeby to sie skompilowalo. Gdybym mial wymieniac bledu, to wkleilbym caly kod.

A co do twojego pytania: taka po prostu jest skladnia listy inicjalizacyjnej. A wywolanie metody to wywolanie metody I kompilator musi wiedzieć o co konkretnie chodzi.

Podobne pytania

0 głosów
3 odpowiedzi 223 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)
+1 głos
3 odpowiedzi 530 wizyt
0 głosów
1 odpowiedź 201 wizyt
pytanie zadane 31 stycznia 2021 w Java przez p_wel Nowicjusz (120 p.)

92,129 zapytań

140,788 odpowiedzi

317,814 komentarzy

61,451 pasjonatów

Advent of Code 2023

Top 15 użytkowników

  1. 1886p. - Łukasz Eckert
  2. 1856p. - Dawid128
  3. 1844p. - Marcin Putra
  4. 1844p. - CC PL
  5. 1775p. - Mikbac
  6. 1633p. - rafalszastok
  7. 1562p. - rucin93
  8. 1553p. - sefirek
  9. 1492p. - Adrian Wieprzkowicz
  10. 1456p. - Eryk Andrzejewski
  11. 1444p. - jaroslawroszyk
  12. 1383p. - Rafał Trójniak
  13. 1325p. - Michal Drewniak
  14. 1275p. - dia-Chann
  15. 1272p. - 13NOONE37
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.

Uwaga - w dniach od 02.12 do 08.12 trwają Mikołajki (książki drukowane mają rabat -35%, ebooki do -45%). Zaś dodatkowy, specjalny kod zniżkowy: HELMIKOLAJ-10 dla naszych Widzów zapewni Wam oszczędność -10zł dla zamówień powyżej 70zł! Warto korzystać!

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...