Ho nidificato i contenitori A e B. Gli attributi sono lì per mostrare che le classi hanno altri membri. Una delle mie funzioni   f    prende un altro contenitore di tali contenitori (diciamo vector di nuovo). 
ContainerA{
    int a;    
    std::vector<ContainerB> contc;    
}
ContainerB{
    int b;    
    std::vector<Element> contd;    
}
class Element{
}
void f (std::vector<ContainerA>& a){}
 Ora un'altra funzione ha bisogno di un vettore di   ContainerA    potenziato con metodi aggiuntivi e aumenta gli elementi di tipo   Element    stesso. Voglio evitare di copiare il più possibile e davvero non voglio la funzione template   f    con tipo Element. Con il resto sono flessibile e posso prendere altre decisioni di progettazione. 
Soluzione:
 Contenitori modello A e B, sottoclasse A e Elemento, usa il puntatore su Elemento, per poter memorizzare   LargerElement    in esso: 
class LargerElement: public Element{
   int e;
}
template <class T>
ContainerA{
    int a;    
    std::vector<ContainerB<T>> contc;    
}
template <class T>
ContainerB{
    int b;    
    std::vector<T*> contd;    
}
class LargerContainerA : public ContainerA<Element>{
    int d;
    public LargerContainerA (){
    // need to rewrite constructor to store
    // LargerElement* in Element* for all elements.
    }
}
void f (std::vector<ContainerA<Element>>& a){}
void g (std::vector<LargerContainerA>& la){}
L'utilizzo è simile a questo:
int main(){
   std::vector<ContainerA<Element>*> vec(100);
   for (auto& v: vec){
       v = new LargerContainerA(...); 
   }
   f(vec);
   std::vector<LargerContainerA*> vec2(vec.size());
   for (int i = 0; i < vec.size(); i++){
       vec2[i] = dynamic_cast<LargerContainerA*>(vec[i]);
   }
   g(lacont); 
   // free memory   
  ...
}
Ma i problemi rimanenti sono:
- Tutto questo è brutto.
 -  Funzione   
gquindi forzata a lavorare in termini di Element nelle sottofunzioni / classi chiamate e cast dinamico a Elemento Largo di tanto in tanto.