Ok, questo è davvero difficile da confessare, ma al momento ho una forte tentazione da cui ereditare std::vector
.
Ho bisogno di circa 10 algoritmi personalizzati per il vettore e voglio che siano direttamente membri del vettore. Ma naturalmente voglio anche avere il resto std::vector
dell'interfaccia. Bene, la mia prima idea, come cittadino rispettoso della legge, era di avere un std::vector
membro in MyVector
classe. Ma poi dovrei riprovare manualmente tutta l'interfaccia di std :: vector. Troppo da scrivere. Successivamente, ho pensato all'eredità privata, così che invece di riprovare i metodi avrei scritto un mucchio di elementi using std::vector::member
nella sezione pubblica. Questo è noioso in realtà.
Ed eccomi, penso davvero di poter semplicemente ereditare pubblicamente da std::vector
, ma fornire un avvertimento nella documentazione che questa classe non dovrebbe essere usata polimorficamente. Penso che la maggior parte degli sviluppatori sia abbastanza competente da capire che questo non dovrebbe essere usato polimorficamente comunque.
La mia decisione è assolutamente ingiustificabile? Se è così, perché? Potete fornire un'alternativa che avrebbe effettivamente membri aggiuntivi ma che non implicherebbe la riscrittura dell'interfaccia di Vector? Ne dubito, ma se puoi, sarò solo felice.
Inoltre, a parte il fatto che qualche idiota può scrivere qualcosa del genere
std::vector<int>* p = new MyVector
c'è qualche altro pericolo realistico nell'uso di MyVector? Dicendo realistico scarto cose come immaginare una funzione che porta un puntatore al vettore ...
Bene, ho dichiarato il mio caso. Ho peccato. Ora tocca a te perdonarmi o no :)
std::vector
interfaccia di @Jim: è piuttosto vasta e, quando arriverà C ++ 1x, si espanderà notevolmente. È molto da scrivere e altro da espandere in pochi anni. Penso che questa sia una buona ragione per considerare l'eredità anziché il contenimento - se si segue la premessa che tali funzioni dovrebbero essere membri (di cui dubito). La regola per non derivare dai contenitori STL è che non sono polimorfici. Se non li stai utilizzando in questo modo, non si applica.