C++程式碼賞析:基於基類指標識別具體子類

RTTI是Runtime Type Identification的縮寫,意思是執行時型別識別。C++引入這個機制是為了讓程式在執行時能根據基類的指標或引用來獲得該指標或引用所指的物件的實際型別。

C++透過以下的兩個操作提供RTTI:

(1)typeid運算子,該運算子返回其表示式或型別名的實際型別。

(2)dynamic_cast運算子,該運算子將基類的指標或引用安全地轉換為派生類型別的指標或引用。

#include #include #include #include #include //基類必須是帶有virtual ,否則無RTTIstruct Base{ Base() { std::cout << “++Base::Base()\n”; } virtual ~Base() { std::cout << “——Base::~Base()\n”; }}; struct Derived1: public Base{ Derived1() { std::cout << “++Derived1::Derived1()\n”; } virtual ~Derived1() { std::cout << “——Derived1::~Derived1()\n”; }};struct Derived2: public Base{ Derived2() { std::cout << “++Derived2::Derived2()\n”; } virtual ~Derived2() { std::cout << “——Derived:2:~Derived2()\n”; }}; int main(){ std::shared_ptr b = std::make_shared(); std::cout << ( typeid(Base)。name()) << std::endl; std::cout << ( typeid(Derived1)。name()) << std::endl; std::cout << ( typeid(Derived2)。name()) << std::endl; std::cout << ( typeid(*b。get())。name()) << std::endl; if(Derived1 *d = dynamic_cast(b。get())) { std::cout << ( typeid(*d)。name()) << std::endl; } if(dynamic_cast(b。get()) == nullptr) { std::cout << “can not dynamic_cast” << std::endl; }}

C++程式碼賞析:基於基類指標識別具體子類

線上編譯測試

https://wandbox。org/nojs/gcc-headhttps://wandbox。org/nojs/clang-head