operador de transmisión dinámica
El operador dynamic_cast puede convertir de forma segura un puntero o referencia de una clase base en un puntero o referencia de una clase derivada. La conversión falla y devuelve una dirección nula. Antes de que se diseñara dynamic_cast, C++ no podía implementar una conversión de una clase base virtual a una clase derivada. dynamic_cast está diseñado para resolver la conversión de clases base virtuales a clases derivadas.
operador typeid
El operador typeid permite determinar el tipo de un objeto en tiempo de ejecución. El resultado de typeid es const type_info&. El valor es una referencia a un objeto type_info que representa el tipo de type-id o expresión, según la forma de typeid utilizada.
clase type_info
La clase type_info describe la información de tipo generada por el compilador en un programa. Los objetos de esta clase pueden almacenar eficientemente punteros a nombres de tipos. La clase type_info también puede almacenar valores codificados adecuados para comparar dos tipos por igualdad o para comparar su orden de permutación. Las reglas de codificación y el orden de los tipos no están especificados y pueden variar de un programa a otro.
class type_info {
public:
type_info(const type_info& rhs) = delete; // cannot be copied
virtual ~type_info();
size_t hash_code() const;
_CRTIMP_PURE bool operator==(const type_info& rhs) const;
type_info& operator=(const type_info& rhs) = delete; // cannot be copied
_CRTIMP_PURE bool operator!=(const type_info& rhs) const;
_CRTIMP_PURE int before(const type_info& rhs) const;
size_t hash_code() const noexcept;
_CRTIMP_PURE const char* name() const;
_CRTIMP_PURE const char* raw_name() const;
};
#include <iostream>
using namespace std;
class Shape
{
public:
virtual void Draw() = 0;
virtual ~Shape() {
};
};
class Circle :public Shape
{
public:
void Draw()
{
cout << "Circle Draw..." << endl;
}
};
class Square :public Shape
{
public:
void Draw()
{
cout << "Square Draw..." << endl;
}
};
int main()
{
Shape* p;
Circle c;
p = &c;
p->Draw();
if (dynamic_cast<Circle*>(p))
{
cout << "p is point to a Circle object" << endl;
Circle* cp = dynamic_cast<Circle*>(p); //安全向下转型
cp->Draw();
}
else if (dynamic_cast<Square*>(p))
{
cout << "p is point to a Square object" << endl;
}
else
{
cout << "p is point to a Other object" << endl;
}
cout << endl;
cout << typeid(*p).name() << endl;
cout << typeid(Circle).name() << endl;
if (typeid(Circle).name() == typeid(*p).name())
{
cout << "p is point to a Circle object" << endl;
((Circle*)p)->Draw();//会做对齐操作 reinterpret_cast不做对齐操作
}
else if (typeid(Square).name() == typeid(*p).name())
{
cout << "p is point to a Square object" << endl;
}
else
{
cout << "p is point to a Other object" << endl;
}
return 0;
}