In C, sì, sono lo stesso indirizzo. Semplice e diretto.
In C++, no, non sono lo stesso indirizzo. Le classi base possono (e io sospetto, lo faccio) venire prima di tutti i membri e le funzioni dei membri virtuali di solito aggiungono dati nascosti alla struttura da qualche parte. Ancora più confuso, un compilatore C++ può anche riorganizzare i membri a volontà, a meno che la classe sia un tipo di layout standard (anche se non so che qualsiasi compilatore lo faccia)
Infine, se la struttura C++ è composta da standard tipi di layout, non contiene classi base né funzioni virtuali e tutti i membri hanno la stessa visibilità e possibilmente altre limitazioni che ho dimenticato, quindi ricade sulle regole C e richiede che il primo membro sia allo stesso indirizzo del oggetto stesso.
§ 9,2/7
Una classe standard la layout è una classe che:
- ha alcun membri dati non statici della classe tipo non standard layout (o array di tali tipi) o riferimento,
- non ha funzioni virtuali (10.3) e classi base virtuali (10.1),
- ha lo stesso controllo di accesso (Articolo 11) per tutti i membri di dati non statici,
- ha non Standard- classi di base del layout,
- non ha membri di dati non statici nella classe più derivata e al massimo una classe base con membri dati non statici o senza classi base con membri dati non statici e
- non ha classi base dello stesso tipo del primo membro dati non statico .
§ 9.2/20
Un puntatore a un oggetto struct standard di layout, opportunamente convertito utilizzando un reinterpret_cast, punti al suo membro iniziale (o se tale elemento è un campo di bit, quindi all'unità in cui risiede) e viceversa. [Nota: potrebbe pertanto esserci un padding senza nome all'interno di un oggetto struct con layout standard, ma non all'inizio, come necessario per ottenere l'allineamento appropriato. -end note]
fonte
2013-07-24 21:30:20
Non sono uguali a questo proposito –
@MooingDuck: Beh, dipende da cosa '' ... 'è. Per la stessa definizione di struct, C++ lo tratterà allo stesso modo di C (le strutture C soddisfano sempre il requisito standard * di C++ *). –