Innanzitutto, "STL" non è un termine ufficiale, è il nome della libreria proposto per includere la libreria standard C ++ quando non c'erano contenitori. Fornisce essenzialmente modelli di container e algoritmi.
Ora, questi modelli di contenitori e algoritmi sono ... modelli in modo da produrre tipi secondo necessità. Non si basano sull'eredità dal punto di vista dell'utente.
Tuttavia, la libreria standard specifica essenzialmente l'interfaccia della libreria, non l'implementazione. Molte implementazioni STL useranno un po 'di orientamento agli oggetti nella loro implementazione ma come utente non lo vedrete se non vi immergete nel codice sorgente delle implementazioni (che devono essere esposte in quanto è essenzialmente un codice template).
I learned that virtual member function which justifys the OO is
contradict with template, is this correct?
No, sono concetti ortogonali che forniscono serie di vantaggi e svantaggi molto diversi. Infatti, in C ++, uno dei vantaggi chiave per l'utilizzo di tale linguaggio è che entrambi sono disponibili e l'utilizzo di uno non annulla l'utilizzo dell'altro. È persino un grande vantaggio.
Ad esempio, uno degli idiomi più interessanti in C ++ è CRTP che utilizza sia i modelli che l'ereditarietà. L'idea è che la parte ereditari ti consente di estendere diversi tipi con un comportamento e dati comuni, come una classe base; mentre la parte template si assicura di generare classi base specifiche per ogni bambino, rendendo impossibile avere un puntatore a tutte le classi usando la classe CRTP come base. Ciò è estremamente utile e non consente di creare confusione con l'ereditarietà laddove non dovrebbe esserci.
Ho anche implementato sistemi di dispacciamento di eventi molto generici che non conoscevano né tipi di eventi o tipi di listener, ma codici combinati interni dinamici e statici che insieme consentivano di generare i giusti tipi interni corrispondenti ai giusti tipi di runtime.
E questo è il punto: non è sempre necessario "l'orientamento all'oggetto". In effetti, il più delle volte non ne hai affatto bisogno, devi definire alcuni tipi e usarli direttamente come parte diversa di un qualche tipo di motore astratto (composizione).
Non è sempre necessario il codice generico, ovvero i modelli. A volte è necessario generalizzare una funzione da applicare a diversi tipi non correlati. Quando sono correlati puoi usare la loro classe base e non avere bisogno di modelli.
Hanno diversi vantaggi e costi completamente diversi, quindi sono buoni da combinare per risolvere problemi complessi.
STL è un buon esempio di un problema in cui la maggior parte riguarda i tipi di provvedere (contenitori) e le funzioni (algoritmi) correlati a un determinato tipo anziché una gerarchia di oggetti runtime.
Nella libreria standard, gli stream sono realizzati in un modo che è tipico dell'orientamento agli oggetti: è una gerarchia di classi di stream che fa cose diverse in un modo che consente di definire una classe di sub-stream che combina diversi comportamenti / capacità.
Lì, l'orientamento all'oggetto è utile, anche se alcune persone preferirebbero che fosse più simile al STL (non sono uno specialista in materia).
Quindi, considerali come strumenti molto diversi, come un cacciavite e un martello. C ++ non ti lascia pensare con un solo strumento in mente.