//C++新特性 强制转换const_cast
/*
强制类型转换时具有一定风险的,有的转换并不一定安全,如果把整数数值转换成指针,把基类指针转换成派生指针
把函数指针转换成另外一种函数指针,把常量指针转换成非常量指针等
1.const_cast 只针对指针,引用,this 去除const属性
2.static_cast 基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐转换的地方
3.reinterpret_cast 具备虚函数的基类与派生类之间的指针或引用的转换
4.dynamic_cast
*/
//dynamic_cast 具备虚函数的基类与派生类之间的指针或引用的转换
//1.基类必须具备虚函数
//2.运行时检查,转型不成功则返回空指针
//3.非必要不要使用dynamic_cast,有额外的函数开销
class CFather
{
public:
CFather()
{
m_nTest = 3;
}
virtual void foo()
{
std::cout << "CFather()::void foo()" << std::endl;
}
int m_nTest;
};
class Cson :public CFather
{
public:
virtual void foo(){
std::cout << "Cson" << std::endl;
}
int m_nson;
};
int main()
{
CFather f;
Cson c;
CFather* pF = &f;
Cson * pS = &c;
//向上转换==子类转换父类
pS = static_cast<Cson*> (pF); //不安全
pS->m_nson;//危险错误,运行保报错
pS = dynamic_cast<Cson*> (pF); //如果转换错误,把指针置换为NULL
//dynamic_cast 能够在运行的时刻,检测出被转换的指针为NULL,本质
//是在运行时刻调用了某个函数判断是否能够转换,需要消耗性能,一般
//情况下,使用在向下转换(父转子才会推荐使用)
if(pS == nullptr)
{
return 0;
}
//具有多态类型的向下转换时必须使用,其余情况下不使用
}