Infatti, lo Standard (C++ 11) utilizza il concetto polimorfica tipo di classe, anziché polimorfa tipo quando descrive il comportamento di typeid
:
primo luogo, qui si descrive cosa accade quando typeid
viene applicato ad un lvalue di tipo classe (cioè il caso quando si fa ciò che ci si aspetta):
(§5.2.8/2) Quando typeid
viene applicato a un'espressione glvalue il cui tipo è un tipo di classe polimorfico (10.3), il risultato si riferisce a un oggetto std::type_info
che rappresenta il tipo dell'oggetto più derivato (1.8) (cioè , il tipo dinamico) a cui si riferisce il glvalue. [...]
Ma quando lo si applica a un puntatore (cioè non a un lvalue di tipo di classe), la regola di seguito si applica:
(§5.2.8/3) Quando typeid
viene applicato a un'espressione diversa da un valore gloriato di un tipo di classe polimorfico, il risultato si riferisce a un oggetto std::type_info
che rappresenta il tipo statico dell'espressione. [...]
Dice che si ottiene il tipo statico (non dinamico), cioè si ottiene il tipo dichiarato del puntatore, non il tipo di oggetto a cui punta effettivamente.
Quindi, sì, i puntatori hanno caratteristiche polimorfiche come descrivete, ma non quando si tratta del risultato di typeid
.
(In realtà, tutte le loro caratteristiche polimorfiche (tra cui, in particolare, le chiamate di funzione membro polimorfi) manifestano solo se stessi quando si tratta di una sorta di dereferenziazione esplicito, sia utilizzando *
o utilizzando ->
,. Così si dovrebbe davvero dire che i puntatori stessi non sono polimorfici, ma solo gli oggetti che si ottengono quando li si designa.)
I puntatori di classe base non puntano alle classi derivate. Stanno indicando le classi base. Questo praticamente svuota il resto delle tue conclusioni. –
@VladLazarenko I puntatori non indicano affatto le classi. Puntano agli oggetti e quelli possono essere di classe base o tipo di classe derivata. Penso che sia ciò che l'OP significa (anche se, in effetti, la formulazione non è ottimale). – jogojapan
Cosa sarebbe diverso se i puntatori fossero considerati tipi polimorfi? Saresti in grado di fare qualcosa che non puoi fare ora? –