Mam pytanie dotyczące inicjowania dziedziczonych członków w konstruktorze klasy pochodnej. Przykładowy kod:C++: Inicjalizacja odziedziczonego pola
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
Ten kod daje mi następujący wynik:
In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'
(patrz http://codepad.org/tn1weFFP)
Zgaduję, dlaczego tak się dzieje? m_int
powinien być członkiem B
, a klasa nadrzędna A
powinna już zostać zainicjowana po zainicjowaniu m_int
w B
(ponieważ konstruktory nadrzędne działają przed inicjacją członka dziedziczonej klasy). Gdzie jest błąd w moim rozumowaniu? Co tak naprawdę dzieje się w tym kodzie?
EDIT
: Jestem świadomy innych możliwości zainicjowania tego elementu (konstruktora bazowego lub przypisania w konstruktorze pochodnym), ale chcę zrozumieć, dlaczego jest to nielegalne w sposobie, w jakim go wypróbowuję? Niektóre specyficzne funkcje języka C++ lub takie? Proszę wskazać mi akapit w standardzie C++, jeśli to możliwe.
To jest dobra odpowiedź, ale chciałbym tylko dodać wyjaśnienie. Kiedy używasz operatora: mówisz kompilatorowi, że zanim zrobi cokolwiek innego, powinien uruchomić te instrukcje. Zasadniczo ustawiasz zmienną przed uruchomieniem konstruktora macierzystego (lub cokolwiek innego). Dlatego zmienna nie istnieje. : A(), m_int (0) również powinno działać.Domyślnie, jeśli nie używasz:, kompilator uruchomi konstruktor klas podstawowych. Innymi słowy, jeśli nic nie zrobisz, C++ zrobi dla ciebie domyślne rzeczy, jeśli zaczniesz określać rzeczy, zakładasz, że wiesz, co robisz. –
Hmmm ... O ile mi wiadomo, konstruktor klasy nadrzędnej zawsze jest uruchamiany przed innymi inicjalizacjami, więc zmienna 'm_int' już istnieje, gdy próbuję ją zainicjować. To nie powinno być problemem ... – Haspemulator
@ Haspemulator Tak, już istnieje, ale właśnie dlatego otrzymujesz błąd. Jest już domyślnie zainicjowana przez konstruktora A. Nie można ponownie zainicjować zmiennej w konstruktorze B. Możesz zmienić przypisanie, tak jak Ben Jackson stwierdza powyżej ('m_int = 0') i to wszystko w tym momencie. – wheaties