static_cast:
- 类型转换:static_cast<type>(exdivssion),例k = static_cast<double>(1234)
- ①把空指针转换成目标类型的空指针
- ②把任何类型的表达式转换成void类型
- ③用于基本数据类型之间的转换
- ④用于类层次结构中基类和子类之间指针或引用的转换
- →上行转换,即把子类的指针或引用转换成基类表示(安全)
- →下行转换,即把基类指针或引用转换成子类表示(没有动态类型检查,所以是不安全的)
dynamic_cast:
- 一样是类型转换:dynamic_cast<type>(exdivssion)
- 和static_cast的区别:
- type必须是类的指针、类的引用或者void*,type和exdivssion必须同为指针和引用
- dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换
- dynamic_cast更加安全,具有检查功能:
- 运行时,程序会检查exdivssion是不是与type类型相兼容,如果是,表达式就返回一个派生类地址,然后转换为type*类型,否则则返回一个NULL
typeid:
- 用来检测指针类型:typeid(expression)或typeid(type)
- typeid操作符的返回结果是名为type_info的标准库类型的对象的引用
#include<iostream>
#include<typeinfo>
using namespace std;
class Shape
{
public:
Shape() {}
virtual ~Shape() {} //虚函数是必不可少的,不然无法通过dynamic_cast进行对Shape指针的转换
};
class Triangle: public Shape
{
public:
Triangle() {}
~Triangle() {}
};
class Rectangle: public Shape
{
public:
Rectangle() {}
~Rectangle() {}
};
int getVertexCount(Shape *b)
{
if(typeid(*b)==typeid(Triangle))
{
b = dynamic_cast<Triangle*>(b);
return 3;
}
if(typeid(*b)==typeid(Rectangle))
{
b = dynamic_cast<Rectangle*>(b);
return 4;
}
return 0;
}
int main(void)
{
Shape s;
cout << getVertexCount(&s) << endl;
Triangle t;
cout << getVertexCount(&t) << endl;
Rectangle r;
cout << getVertexCount(&r) << endl;
int k = 5;
printf("%.2f\n", k); //输出乱码
printf("%.2f\n", static_cast<double>(k)); //正确,输出5.00
//printf("%.2f\n", dynamic_cast<double>(k)); //非法
}