• 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,053 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 370 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)
+1 głos
3 odpowiedzi 636 wizyt
0 głosów
1 odpowiedź 217 wizyt
pytanie zadane 31 stycznia 2021 w Java przez p_wel Nowicjusz (120 p.)

93,096 zapytań

142,059 odpowiedzi

321,514 komentarzy

62,440 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

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!

...