智能指针也支持动态类型转换,如std::dynamic_pointer_cast,它可以将基类的智能指针转换为派生类的智能指针。这在处理复杂的类层次结构时非常有用。 例如: std::shared_ptr<Base> basePtr = std::make_shared<Derived>();std::shared_ptr<Derived> derivedPtr = std::dynamic_pointer_cast<Derived>(basePtr); ...
输出结果是:Null pointer on second type-cast 两个dynamic_cast都是下行转换,第一个转换是安全的,因为指向对象的本质是子类,转换的结果使子类指针指向子类,天经地义;第二个转换是不安全的,因为指向对象的本质是父类,“指鹿为马”或指向不存在的空间很可能发生! 最后补充一个特殊情况,当待转换指针是void*或者转...
const_pointer_cast() dynamic_pointer_cast() static_pointer_cast() reinterpret_pointer_cast() (C++17标准引入) 如图所示,指针p1、p2指向同一块内存地址。 5.weak_ptr智能指针 常用的成员函数: reset():重置智能指针,使它所持有的资源为空。 swap():交换两个智能指针所管理的资源。 expired():检查weak_pt...
編譯器錯誤 C3587 在amp 限制程式碼中不支援 dynamic_cast 編譯器錯誤 C3588 在amp 限制程式碼中不支援從 'type1' 轉型為 'type2' 編譯器錯誤 C3589 'string':在 amp 限制程式碼中不支援字串常值的使用方式 編譯器錯誤 C3590 'token':: 如果 Lambda 受到限制,則不支持參考擷取或 'this' 擷取 ...
C++中是允许裸指针,因此裸指针之间转换方法同C语言指针强转,智能指针转换不能通过上述方法进行强转,必须通过库提供转换函数进行转换。 C++11的方法是:std::dynamic_pointer_cast;boost中的方法是:boost::dynamic_pointer_cast #include #include #include
在类层次上进行转换的时候 dynamic_cast于static_cast的效果一样! 他返回一个新类型的值,或者会抛出一个异常! 来看代码: #include<iostream> using namespace std; struct V { virtual void f() {}; // must be polymorphic to use runtime-checked dynamic_cast ...
寻找所需类的失败会导致dynamic_cast返回一个空值,而解引用一个空指针会引起无定义的行为。因此应该总是认为dynamic_cast的结果可能为空并进行检查。 Enforcement(实施建议) (Complex) Unless there is a null test on the result of a dynamic_cast of a pointer type, warn upon dereference of the pointer. ...
上面看到的是指针的转换,我们也可以用dynamic_cast将基类引用转换成派生类引用! dynamic_cast<Type&>(val); Type是派生类型,val是基类类型, 当val实际引用一个Type类型对象,或者val是一个Type派生类型的对象的时候,dynamic_cast操作才将操作数val转换为想要的Type&类型。
C++引入了static_cast、dynamic_cast、const_cast和reinterpret_cast这4种类型转换操作符,提供了更安全、...
类似的函数还有dynamic_pointer_cast,该函数是用来对智能指针进行转换的,可以理解为是dynamic_cast的智能...