可以看到,除空指针检查之外,dynamic_cast 的大部分任务是由一个 ABI 提供的 __dynamic_cast 函数所完成的。这个 __dynamic_cast 函数的原型如下: extern "C" void* __dynamic_cast (const void *sub, const abi::__class_type_info *src, const abi::__class_type_info *dst, std::ptrdiff_t src2...
如果转换不合法,对于指针类型,dynamic_cast 会返回空指针 nullptr ; 对于引用类型,它会抛出 std::bda_cast 异常 注意:dynamic_cast是在运行时检查,并且 使用dynamic_cast 转换时,涉及的类通常至少需要有一个虚函数(比如虚析构函数),这样编译器才能再运行时使用类型信息和执行转换。另外在转换前,也得 Base* base...
一个空指针值通过dynamic_cast转换为目标类型的空指针值。 使用dynamic_cast < type-id > ( expression )时,如果expression无法安全地转换为type-id类型,运行时检查将导致强制转换失败。 例如: C++ // dynamic_cast_7.cpp// compile with: /c /GRclassA{virtualvoidf();};classB{virtualvoidf();};voidf...
对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。 dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。 在类层次间进行上行转换时,dynamic_cast和static_cast ...
如果源指针为空指针,则返回空指针。 如果目标类型是源类型的公有派生类,则通过虚拟表查找目标类型的偏移量,然后将偏移量加到源指针上,得到目标指针。 如果目标类型不是源类型的公有派生类,或者转换失败,则抛出std::bad_cast异常。 对于引用: 如果源类型和目标类型相同,则直接返回源引用。
e也可以是一个空指针,结果是所需类型的空指针。 【比较】static_cast在下行转换时不安全,是因为即使转换失败,它也不返回NULL dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换(cross cast)。 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的【父类指针本身就可指...
如果downcast 是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。 如果downcast 不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。 dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
b.父类指针指向父类对象,转换不安全,dynamic_cast 返回nullptr。 此时若使用static_cast, 返回非空指针,更不安全。 eg: #include <iostream> using namespace std; class A{ public: A(){} virtual void eat() { std::cout<<"A::eat()"<<std::endl; ...
在多态的情况下,用于安全地将基类指针或引用转换为派生类指针或引用。如果转换失败(即基类指针或引用并不指向派生类对象),dynamic_cast会返回空指针(对于指针)或抛出bad_cast异常(对于引用),从而避免了类型转换的错误。 用于在运行时判断一个对象的实际类型是否为指定的类型,通过将指向基类的指针或引用转换为指向派生...