C++ 体现dynamic_cast和static_cast差别的两个例子

来源:互联网 发布:苏联解体 征兆 知乎 编辑:程序博客网 时间:2024/06/05 06:10

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 NULLStaticCast(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);//okDerived *ptrDerived2 = static_cast<Derived *>(ptrBase);// errordelete ptrBase;return 0;}


0 0
原创粉丝点击