1)static_cast :编译时期的静态类型检查 static_cast < type-id > ( expression ) 该运算符把expression转换成type-id类型,在编译时使用类型信息执行转换,在转换时执行必要的检测(指针越界、类型检查),其操作数相对是安全的 2)dynamic_cast:运行时的检查 用于在集成体系中进行安全的向下转换downcast,即基类指针/引...
size(); ++i) { shapes[i]->draw(); if(dynamic_cast<circle*>(shapes[i])) Ncircles++; if(dynamic_cast<ellipse*>(shapes[i])) Nellipses++; if(dynamic_cast<rectangle*>(shapes[i])) Nrects++; if(dynamic_cast<shape*>(shapes[i])) Nshapes++; cout<<"dynamic_cast:"<<Nshapes<<endl;...
(Derived*d=dynamic_cast<Derived*>(b1);d!=nullptr){std::cout<<"成功从 b1 向下转换到 d\n";d->name();// 可以安全调用}Base*b2=new Derived;if(Derived*d=dynamic_cast<Derived*>(b2);d!=nullptr){std::cout<<"成功从 b2 向下转换到 d\n";d->name();// 可以安全调用}delete b1;delete...
D *pd1 = static_cast<D *>(pb); //copile error D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL delete pb; } 在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。 reinpreter_cast 用法:reinpreter_cast<type-id> (expressio...
static_cast,非多态类型的转换,不执行运行时类型检查,通常来说只用于转换数值数据类型,可以实现子类的向上转换; dynamic_cast,用于多态类型的转换,转换时进行类型检查,只适用于指针或引用,不明确的指针的转换会返回空指针但不引发异常,可以实现向上转换或者向下转换; const_cast,取消const的只读语义; reinterpret_cast,...
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的; 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。 class B{ public: int m_iNum; ...
()" << endl; } //要使用dynamic_cast, Base类要求是多态的,故加上此虚函数 virtual void print(){ cout << "Base::print()" << endl; } private: long _base; }; class Derived : public Base { public: Derived(long base,long derived) : Base(base)//创建基类子对象 , _derived(derived)...
static_cast,非多态类型的转换,不执行运行时类型检查,通常来说只用于转换数值数据类型,可以实现子类的向上转换;dynamic_cast,用于多态类型的转换,转换时进行类型检查,只适用于指针或引用,不明确的指针的转换会返回空指针但不引发异常,可以实现向上转换或者向下转换;const_cast,取消const的只读语义;reinterpret_cast,对位的...
dynamic_cast依赖于C++的RTTI, 让程序员在运行时识别C++类对象的类型。 dynamic_cast的出现一般说明我们的基类和派生类设计出现了问题,派生类破坏了基类的契约,不得不通过dynamic_cast转换到子类进行特殊处理,这个时候更希望来改善类的设计,而不是通过dynamic_cast来解决问题。
dynamic_cast reinterpret_cast explicit static 表达式 定义能在编译时求值的表达式。 这种表达式能用作非类型模板实参、数组大小,并用于其他要求常量表达式的语境,例如 intn=1;std::array<int, n>a1;// 错误:n 不是常量表达式constintcn=2;std::array<int, cn>a2;// OK:cn 是常量表达式 ...