Odpowiedź zależy od wersji językowej, ponieważ zmieniła się z C++ 03 na C++ 11.
w C++ 03, zasada brzmiała:
Członkowie wewnątrz bloku sterującego sam dostęp (czyli z jednego public
, protected
, private
słowo aby następnego z tego zestawu) mają być przydzielane w kolejności deklaracji w klasie, niekoniecznie w sposób ciągły.
w C++ 11, zasada ta została zmieniona na:
Użytkownicy z poziomu sterowania sam dostęp (publiczne, chronione, prywatne) są przydzielane w kolejności deklaracji wewnątrz klasy, niekoniecznie w sposób ciągły.
Więc w C++ 03, można zagwarantować (używam @
oznaczać przesunięcie członka w klasie):
@m_ac < @m_scp
@m_i1 < @m_i2 < @m_b1 < @m_b2
W C++ 11 masz kilka dodatkowych gwarancji:
@m_ac < @m_scp
@m_sc < @m_i1 < @m_i2 < @m_b1 < @m_b2
@m_name < @m_b3
W obu wersjach, kompilator może zmienić kolejność członków w różnych sieciach, jak uzna to za stosowne, a nawet może przeplatać łańcuchy.
Należy pamiętać, że istnieje jeszcze jeden mechanizm, który może wejść do obrazu: zajęcia standardowego układu.
Klasa jest układem standardowym, jeśli nie ma wirtualnych, jeśli wszystkie niestatyczne elementy danych mają tę samą kontrolę dostępu, nie ma klas podstawowych ani niestatycznych elementów danych o niestandardowym typie układu lub typ odniesienia i jeśli ma najwyżej jedną klasę z niestatycznymi elementami danych w łańcuchu dziedziczenia (npnie może zarówno zdefiniować własnych niestatycznych elementów danych, jak i odziedziczyć niektórych z klasy bazowej).
Jeśli klasa jest standardowym układ, istnieje dodatkowa gwarancja, że adres jego pierwszej niestatyczny członka danych jest identyczna z samego obiektu klasy (co oznacza po prostu, że wyściółka nie może występować na początku układ klasy).
Należy zauważyć, że warunki będące standardowym układem, a także praktyczne kompilatory, które nie dokonują pesymizacji, skutecznie oznaczają, że w klasie układu standardowego elementy będą układane w sposób ciągły według kolejności deklaracji (z dopełnieniem do wyrównania w razie potrzeby przeplatanym)).
Unikaj 'chronionych', unikaj nagich wskazówek. –
Praktycznie duplikat: http://stackoverflow.com/q/15763091/560648 Proszę wyszukać przed pytaniem. –