Dimensione degli oggetti durante l'ereditarietà multilivello [chiusa]

-1

Di seguito c'è una pseudo dichiarazione per un'eredità multilivello.

Base class ( protected int data)

derived1 : virtual public base ( protected int data1 )

derived2 : virtual public base ( protected int data2)

derived3 : derived1,derived2 ( private int data3 )

Main(){ base b;    derived1 d1;   derived2 d2;   derived3 d3; }

    sizeof(b) // 4 which is correct as only int (4bytes)
    sizeof(d1) // 12 why not 8 -> 4(base) + 4(derived)
    sizeof(d2) // ??? whatever applies above should apply here
    sizeof(d3) // 24 why not 12 -> 4(base) + 4(derived1/derived2) + 4(d3).

Anche le dimensioni includono anche tabelle virtuali. Anche qui non può esserci una tabella virtuale in quanto non è definita alcuna funzione virtuale. Aiutatemi per chiarire il mio dubbio.

PS: Quello che ho capito finora:

Unless the function is declared virtual in base class,

base *bptr;
 derived d;
 bptr = &d;
 bptr->fun();  // will call the base class function.

But if the fun() is declared virtual then the above code will call derived class fun().

    
posta Haswell 09.03.2014 - 06:33
fonte

1 risposta

2

La domanda che fai non ha una risposta nello standard C ++. I compilatori sono liberi di inserire membri aggiuntivi nelle classi per motivi di ereditarietà multipla, controllo di accesso virtuale, allineamento e così via. Penso che mi aspetterei un oggetto aggiuntivo per una classe base virtuale, ma non l'ho studiato in modo specifico.

In pratica puoi aspettarti un singolo puntatore piuttosto che un'intera tabella virtuale e una spaziatura ragionevolmente prevedibile. Oltre a questo, vorrei esitare a generalizzare.

Se vuoi veramente sapere perché una struttura specifica che hai scritto ha le dimensioni specifiche che fanno, allora puoi usare il debugger per scoprire cosa viene effettivamente memorizzato in ogni posizione. Qualsiasi programma scritto per sfruttare tali informazioni sarebbe ovviamente non portabile.

La tua supposizione è corretta ma (a) questo è un down-cast che deve essere esplicito (b) la funzione virtuale non è la stessa della classe base virtuale.

BTW si chiama multiple inheritance .

    
risposta data 09.03.2014 - 15:06
fonte

Leggi altre domande sui tag