C++ 内存::static_pointer_cast



除了向上转型(从派生类指针到基类指针),static_cast 还可以执行相关类之间指针的向下转型(从基类指针到派生类指针)。在运行时不会进行任何验证以确保转换的对象实际上是目标类型的完整对象。因此,程序员有责任保证转换的安全性。

语法

以下是 C++ Memory::static_pointer_cast 的语法:

shared_ptr<T> static_pointer_cast (const shared_ptr<U>& sp) noexcept;

参数

sp - 它是一个共享指针。

示例 1

以下是一个示例,我们将执行 static_pointer_casting 并获取输出。

#include <iostream>
#include <memory>
struct TP {
   static const char* static_type;
};
const char* TP::static_type = "TUTORIALSPOINT";
int main (){
   std::shared_ptr<TP> Result;
   Result = std::make_shared<TP>();
   std::cout << "Result: " << Result->static_type << '\n';
   return 0;
}

输出

让我们编译并运行上面的程序,这将产生以下结果:

Result: TUTORIALSPOINT

示例 2

让我们看看下面的示例,其中 static_pointer_cast 向上遍历类层次结构。

#include <iostream>
#include <memory>
class Base{
   public:
      int x;
      virtual void tp() const{
         std::cout << "HELLO\n";
      }
      virtual ~Base() {}
};
class Derived : public Base{
   public:
      void tp() const override{
         std::cout << "Namaste\n";
      }
      ~Derived() {}
};
int main(){
   auto basePtr = std::make_shared<Base>();
   std::cout << "A Says: ";
   basePtr->tp();

   auto derivedPtr = std::make_shared<Derived>();
   std::cout << "B Says: ";
   derivedPtr->tp();
   basePtr = std::static_pointer_cast<Base>(derivedPtr);
   std::cout << "C Says: ";
   basePtr->tp();
}

输出

运行以上代码后,它将显示如下输出:

A Says: HELLO
B Says: Namaste
C Says: Namaste

示例 3

考虑以下示例,我们将构造一个临时的 shared_ptr 并调用一个运算符。

#include <iostream>
#include <memory>
struct BaseClass {};
struct DerivedClass : BaseClass {
   void x() const{
      std::cout << "WELCOME TO TP\n";
   }
};
int main(){
   std::shared_ptr<BaseClass> ptr_to_base(std::make_shared<DerivedClass>());
   std::static_pointer_cast<DerivedClass>(ptr_to_base)->x();
}

输出

当代码执行时,它将生成如下所示的输出:

WELCOME TO TP
广告