C'è un motivo per cui è specificato che std::type_info
sia polimorfico? Il distruttore è specificato per essere virtuale (e c'è un commento all'effetto di "in modo che sia polimorfico" in The Design and Evolution of C++). Non riesco davvero a vedere un motivo convincente per cui. Non ho alcun caso d'uso specifico, mi stavo chiedendo se c'è mai stato un fondamento logico o una storia dietro di esso.Perché è std :: type_info polimorfico?
Ecco alcune idee che mi è venuta in mente e respinto:
- E 'un punto di estensibilità - implementazioni potrebbero definire sottoclassi, e programmi potrebbe quindi provare a
dynamic_cast
unstd::type_info
ad un altro, specifica di esecuzione definito tipo derivato. Questa è probabilmente la ragione, ma sembra che sia altrettanto facile per le implementazioni aggiungere un membro definito dall'implementazione, che potrebbe essere virtuale. I programmi che desiderano testare queste estensioni sarebbero necessariamente non portatili. - È per garantire che i tipi derivati siano distrutti correttamente quando
delete
un puntatore di base. Ma non ci sono tipi derivati standard, gli utenti non possono definire tipi derivati utili, perchétype_info
non ha costruttori pubblici standard e quindidelete
un puntatoretype_info
non è mai sia legale che portatile. E i tipi derivati non sono utili perché non possono essere costruiti - l'unico uso che conosco per tali tipi derivati non costruibili è l'implementazione di cose come il tratto di tipois_polymorphic
. - Lascia aperta la possibilità di metaclassi con tipi personalizzati: ogni reale polimorfo
class A
otterrebbe un "metaclasse" derivatoA__type_info
, che deriva datype_info
. Forse tali classi derivate potrebbero esporre membri che chiamanonew A
con vari argomenti del costruttore in un modo sicuro dal tipo e cose del genere. Ma rendere lo stesso polimorficotype_info
rende praticamente impossibile l'implementazione di tale idea, perché dovresti avere metaclassi per i tuoi metaclassi, ad infinitum, il che è un problema se tutti gli oggettitype_info
hanno una durata di archiviazione statica. Forse escludendo questa è la ragione per averlo reso polimorfico. - C'è qualche utilità per l'applicazione di caratteristiche RTTI (diversi
dynamic_cast
) perstd::type_info
stesso, o qualcuno ha pensato che fosse carino, o imbarazzante setype_info
non era polimorfica. Ma dato che non esiste un tipo derivato standard e nessun'altra classe nella gerarchia standard a cui si potrebbe ragionevolmente provare a eseguire il cross-cast, la domanda è: che cosa? Esiste un uso per espressioni cometypeid(std::type_info) == typeid(typeid(A))
? - È perché gli implementatori creeranno il proprio tipo derivato privato (come credo che GCC lo faccia). Ma perché preoccuparsi di specificarlo? Anche se il distruttore non è stato specificato come virtuale e un implementatore ha deciso che dovrebbe essere, sicuramente quell'implementazione potrebbe dichiararlo virtuale, perché non modifica l'insieme delle operazioni consentite su
type_info
, quindi un programma portatile non sarebbe in grado per dire la differenza - È qualcosa a che fare con compilatori con ABI parzialmente compatibili coesistenti, probabilmente come risultato del collegamento dinamico. Forse gli implementatori potrebbero riconoscere la propria sottoclasse
type_info
(a differenza di quella proveniente da un altro fornitore) in modo portatile se fosse garantito che lotype_info
fosse virtuale.
L'ultimo è il più plausibile per me al momento, ma è piuttosto debole.
Sì, ho capito, ma non riesco a vedere nulla di portatile che si possa fare con le informazioni che si tratta di una sottoclasse o meno. Sembra che tutti i programmi validi e portatili ora sarebbero ancora validi se non fossero polimorfi. Fare in modo che non sia possibile rilevare sottoclassi (rendendo type_info non polimorfo) non dovrebbe cambiare nulla per i programmi portatili, per quanto posso vedere, e non dovrebbe rendere più difficile creare estensioni non portabili. Riesci a pensare ad un contro-esempio, a qualcosa reso possibile da questa specifica? – Doug
@Doug: guarda la mia modifica –
Grazie - ma continuo a non capire perché quest'ultima espressione richiede che 'type_info' sia polimorfico. Tutte le funzioni utili su 'type_info', come' operator == ',' before', 'name', ecc. Non sono specificate come virtuali. Quindi, se un'implementazione richiede una distribuzione virtuale su tali funzioni, suppongo che possa dichiararle virtuali o delegare a funzioni di implementazione virtuale e, in caso contrario, non è necessario renderle virtuali. C'è qualcosa che mi manca? – Doug