Domanda
mi aspettavo questo codice per stampare 'Same 1' e 'Same2', ma esso stampa solo 'Same1':
#include <iostream>
#include <typeinfo>
using namespace std;
struct C{virtual ~C(){}};
struct D : C{};
int main(){
D d;
C c, &cr1 = d;
if(typeid(cr1) == typeid(D)) cout << "Same1";
if(typeid(&cr1) == typeid(D*)) cout << "Same2";
}
Sia §5.2.8 / 2 e §5.3.1 / 3 sembrano suggerire a me che 'Same2' deve essere stampato.
Che cosa e dove è il trucco?
Soluzione
I puntatori non sono tipi polimorfici. Non hanno i membri virtuali. In realtà, non hanno membri di sorta. Inoltre non possono derivare da altri tipi, né essere utilizzato come classi base. Quindi, il tipo statico e dinamico di un T*
è sempre T*
.
In linea "Same2", si sta confrontando il typeid di un puntatore, non il punta-to oggetto. Il compilatore sembra quindi solo al tipi statici C*
e D*
. Non sono ovviamente la stessa, e deve avere gli oggetti type_info
distinti.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow