在C++中,可以使用std::static_pointer_cast
函数将std::shared_ptr<Derived>
向上转换为std::shared_ptr<Base>
#include <iostream>
#include <memory>
class Base {
public:
virtual ~Base() = default;
};
class Derived : public Base {
public:
void print() {
std::cout << "Derived class" << std::endl;
}
};
int main() {
std::shared_ptr<Derived> derived_ptr = std::make_shared<Derived>();
// 将 std::shared_ptr<Derived> 向上转换为 std::shared_ptr<Base>
std::shared_ptr<Base> base_ptr = std::static_pointer_cast<Base>(derived_ptr);
// 使用 dynamic_cast 检查转换是否成功
std::shared_ptr<Derived> derived_ptr_check = std::dynamic_pointer_cast<Derived>(base_ptr);
if (derived_ptr_check) {
std::cout << "Conversion successful" << std::endl;
derived_ptr_check->print();
} else {
std::cout << "Conversion failed" << std::endl;
}
return 0;
}
在这个例子中,我们创建了一个std::shared_ptr<Derived>
对象,然后使用std::static_pointer_cast
将其向上转换为std::shared_ptr<Base>
。为了确保转换成功,我们使用std::dynamic_pointer_cast
尝试将std::shared_ptr<Base>
转换回std::shared_ptr<Derived>
。如果转换成功,我们将打印出"Conversion successful"以及"Derived class"。
请注意,向上转换(从派生类到基类)是安全的,因为派生类对象包含基类对象的所有信息。然而,向下转换(从基类到派生类)可能会导致未定义行为,因此需要谨慎处理。在这种情况下,可以使用std::dynamic_pointer_cast
进行安全的向下转换,它会在转换失败时返回空指针。
领取专属 10元无门槛券
手把手带您无忧上云