2013-02-06 13 views
5

consideri il codice qui sottoC++: Inheritance virtuale

#... 
class A {}; 
class B: public A{}; 
class C: virtual public A{}; 
class D: virtual public C{}; 
// No More Classes 
... 
int _tmain(int argc, _TCHAR* argv[]) { 
cout<<sizeof(A)<<" "; 
cout<<sizeof(B)<<" "; 
cout<<sizeof(C)<<" "; 
cout<<sizeof(D)<<"."; 

... 
} 

O/P: 1 1 4 8.

Domanda:

  1. sizeof (A) = 1 byte, e questa posizione tenere ciò che è significativo per il compilatore/noi.
  2. Perché il compilatore si preoccupa di aggiungere vptr in oggetto classe C quando non vi è nulla in realtà risiede.
  3. Se non si dispone di alcuna funzione virtuale, il compilatore sta aggiungendo un vptr aggiuntivo agli oggetti derivati.

*. è la mia prima domanda qui, correggimi se hai trovato qualcosa di sbagliato.

+0

Per una prima domanda qui: +1 per un post buono, ben formattato e auto-esplicativo. –

+2

Non vedo nessuna domanda, solo una lista di affermazioni. –

+0

@JoachimPileborg - "2. Perché il compilatore si preoccupa di aggiungere vptr in oggetto classe C quando non vi è nulla in realtà". Immagino che '3.' sia lo stesso di .2'. E '' 'è molto probabile - mostrando che l'OP sa perché il risultato è' 1'. –

risposta

0

annuncio 1. Vedere PeddleSpam's answer

ad 2. IIRC il compilatore mette più informazioni di quelle funzioni puntatori solo virtuali nel cosiddetto VMT. Un'altra informazione è la posizione del virtuale A in C, penso.

ad 3. Vedere 2.