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?

È stato utile?

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
scroll top