Estaba escribiendo un operador == entre dos tipos de puntero inteligente y pensé que debería ejecutar una comprobación de cordura rápida. Estoy sorprendido por el resultado ...¿Cómo pueden los punteros de las subclases ser estrictamente iguales a los punteros de clase padre?
En el siguiente fragmento, ¿cómo es que todas las variantes de f y b terminan con el mismo valor?
struct Foo {
int x;
};
struct Bar : public Foo {
int y;
};
#include <iostream>
int main()
{
Bar bar;
Foo * f = &bar;
Bar * b = &bar;
std :: cout << f << " " << b << " " << (f == b) << "\n";
void * fv = f;
void * bv = b;
std :: cout << fv << " " << bv << " " << (fv == bv) << "\n";
int fi = reinterpret_cast <int> (f);
int bi = reinterpret_cast <int> (b);
std :: cout << fi << " " << bi << " " << (fi == bi) << "\n";
}
Por cierto, el objetivo original fue verificar que la expresión (f == b) es equivalente a (f == (Foo *) b) - Necesito esta conversión implícita para que se comporte adecuadamente con las plantillas. – spraff