1、dynamic_cast在转换时会进行类型检查,static_cast则仅仅是根据类型之间的关系在编译时确定不同类型的偏移量。
如下的例子可简单说明其差异
class Base;
class Derived;
void DynamicCast(Base *ptrBase);
void StaticCast(Base *ptrBase);
class Base
{
public:
Base():m_iBase(0){}
virtual ~Base();
private:
int m_iBase;
};
Base::~Base()
{
DynamicCast(this); //print NULL
StaticCast(this); //print not NULL
}
class Derived:public Base
{
public:
Derived():m_iDerived(1){}
private:
int m_iDerived;
};
void DynamicCast(Base *ptrBase)
{
std::cout << "dynamic_cast. Derived ptr:" << dynamic_cast<Derived *>(ptrBase) << std::endl;
}
void StaticCast(Base *ptrBase)
{
std::cout << "static_cast. Derived ptr:" <<static_cast<Derived *>(ptrBase) << std::endl;
}
int main()
{
Base *ptrBase = new Derived();
delete ptrBase;
return 0;
}
2、存在虚继承时无法使用static_cast
class Base
{
public:
Base():m_iBase(0){}
virtual ~Base(){};
private:
int m_iBase;
};
class Derived: virtual public Base
{
public:
Derived():m_iDerived(1){}
private:
int m_iDerived;
};
int main()
{
Base *ptrBase = new Derived();
Derived *ptrDerived = dynamic_cast<Derived *>(ptrBase);//ok
Derived *ptrDerived2 = static_cast<Derived *>(ptrBase);// error
delete ptrBase;
return 0;
}