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
廣告