Nella mia precedente domanda , è stato evidenziato che le implementazioni di C ++ come GCC devono memorizzare un puntatore vtable in ogni copia di una classe per ogni classe genitore che ha una funzione virtuale.
Quindi una classe che implementa dire 5 "interfacce" (vale a dire pure classi astratte) deve avere almeno 5 punti di misura prima che anche i suoi membri vengano aggiunti.
A prima vista, questo sembra necessario. Quando abbiamo upcast, tutto ciò che possiamo fare è cambiare il puntatore. Ma abbiamo bisogno di un nuovo vtable per quel puntatore upcasted. Quindi non c'è molta altra opzione oltre a metterlo nell'oggetto stesso.
Lo svantaggio di questo è che paghiamo un costo per oggetto per le classi genitore virtuali, anche quelle senza membri.
Che dire invece, facendo un puntatore "due puntatori". Il primo puntatore è un puntatore all'oggetto. Il secondo è un puntatore ad esso è vtable. Questo potrebbe forse essere fatto solo per gli oggetti virtuali.
L'oggetto stesso potrebbe ora essere solo dati puri, senza bisogno di puntatori vtable.
Nota quindi abbiamo bisogno solo di un puntatore vtable, anche se ci sono più genitori. Il vtable stesso potrebbe avere voci che descrivono come upcast, o forse il compilatore sa come farlo.
C'è qualche ragione per cui questo approccio non è fattibile > Esistono implementazioni C ++ che lo fanno?
(Nota: Capisco che si possano evitare basi pure astratte come interfacce e "duck typing" e nei concetti futuri, ma lasciamo ignorare per il momento)