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

Konstruktor klasy pochodnej.

Object Storage Arubacloud
0 głosów
903 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,320 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,320 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,320 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,320 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 273 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)
+1 głos
3 odpowiedzi 558 wizyt
0 głosów
1 odpowiedź 204 wizyt
pytanie zadane 31 stycznia 2021 w Java przez p_wel Nowicjusz (120 p.)

92,575 zapytań

141,425 odpowiedzi

319,650 komentarzy

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

...