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.