Stavo leggendo la documentazione di std::sub_match<BidirectionalIterator>
e ho visto che eredita pubblicamente da std::pair<BidirectionalIterator, BidirectionalIterator>
. Poiché uno sub_match
è semplicemente una coppia di iteratori in una sequenza di caratteri, con alcune funzioni aggiuntive, posso capire che è implementato con uno pair
, ma perché utilizzare l'ereditarietà pubblica?Perché lo std :: sub_match <T> eredita pubblicamente da std :: pair <T, T>?
Il problema con l'ereditare pubblicamente da std::pair<T,U>
equivale a ereditare pubblicamente dalla maggior parte delle altre classi standard: non si intende che vengano manipolate in modo polimorfico (in particolare non definiscono un distruttore virtuale). Anche gli altri membri non funzioneranno correttamente, ovvero l'operatore di assegnazione e la funzione membro di scambio (non copieranno il membro matched
di sub_match
).
Perché ha Boost sviluppatori e quindi la commissione ha deciso di implementare sub_match
ereditando pubblicamente da pair
invece di usare la composizione (o ereditarietà privata con l'utilizzo di dichiarazioni se volevano mantenere l'accesso utente tramite first
e second
)?
Concordo sull'allocazione dinamica che probabilmente non dovrebbe mai accadere. Tuttavia, i problemi potrebbero ancora apparire con '=' e 'swap'. Ad esempio, stavo pensando a Boost.Range, ma non richiede che gli intervalli siano assegnabili o scambiabili. Tuttavia, è interessante notare che gli algoritmi Boost.Range non accettano 'sub_match'es come argomenti, ma lo fanno se vengono manipolati attraverso un riferimento a una' coppia' (problemi delle classi di tratto). –