Diciamo che ho un'interfaccia chiamata ParentClass . ParantClass ha due implementazioni, ParentClassA e ParentClassB . C'è anche l'interfaccia ChildClass , con un'implementazione ChildClassA e ChildClassB . L'interfaccia ParentClass ha una funzione chiamata createChild , che restituisce un puntatore a un'interfaccia ChildClass del tipo appropriato ( ParentClassA::createChild restituisce un ChildClassA mentre ParentClassB::createChild restituisce un ChildClassB ).
Il codice tende ad assomigliare a questo:
ChildClass *child = parentClass->createChild();
child->destroy();
L'inefficienza qui è che l'interfaccia ParentClass restituirà sempre un'interfaccia ChildClass della stessa implementazione, quindi è in uso una tonnellata di vtables ma c'è solo un'implementazione a cui portano.
Una soluzione teoricamente più efficiente sarebbe che ParentClass::createChild restituisca un puntatore opaco e che tutte le funzioni membro contenute in ChildClass vengano spostate in ParentClass e che il puntatore opaco venga passato come primo argomento. Ciò si tradurrà in un singolo vtable, ma il codice finisce per essere un po 'più brutto.
E quel codice tende ad assomigliare a questo:
ChildClass *child = parentClass->createChild();
parentClass->destroyChild(child);
Questa parte della mia applicazione viene utilizzata abbastanza frequentemente, quindi le prestazioni sono una considerazione importante. Ma anche leggibilità e codice gestibile. Non sono sicuro di quale approccio dovrei usare.