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

Konstruktor klasy pochodnej.

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,079 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 400 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)
+1 głos
3 odpowiedzi 656 wizyt
0 głosów
1 odpowiedź 226 wizyt
pytanie zadane 31 stycznia 2021 w Java przez p_wel Nowicjusz (120 p.)

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2581p. - dia-Chann
  2. 2537p. - Łukasz Piwowar
  3. 2528p. - Łukasz Eckert
  4. 2514p. - CC PL
  5. 2476p. - Tomasz Bielak
  6. 2445p. - Łukasz Siedlecki
  7. 2443p. - rucin93
  8. 2373p. - Marcin Putra
  9. 2310p. - Michal Drewniak
  10. 2258p. - Adrian Wieprzkowicz
  11. 2210p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 1733p. - rafalszastok
  14. 1701p. - Michał Telesz
  15. 1580p. - ssynowiec
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!

...