在 C++ 泛型程式設計中,處理執行時間類型資訊(RTTI)提供了兩種方法:dynamic_cast 運算子用於將基底類別指標或引用轉換為衍生類別的指標或參考。 typeid 運算子傳回物件的類型訊息,可以透過其 name() 成員函數取得類型名稱。 RTTI 雖然方便,但會產生額外開銷,因此僅建議在需要時使用,同時要注意可能導致的二進位相容性問題。
C++ 泛型程式設計中處理執行時間類型資訊(RTTI)
在C++ 泛型程式設計中,我們常常需要在運行時取得物件或引用變數的類型資訊。 C++ 提供了運行時類型資訊(RTTI)機制來實現這一目的。
使用 dynamic_cast
dynamic_cast
運算子用於將一個基底類別指標或引用轉換為衍生類別指標或引用。如果轉換成功,它會傳回衍生類別的指標或參考;否則,傳回 nullptr
。
class Base { }; class Derived : public Base { }; int main() { Base* base_ptr = new Derived(); // 检查 base_ptr 是否指向 Derived 对象 Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr); if (derived_ptr != nullptr) { // 转换成功,base_ptr 指向 Derived 对象 } }
使用typeid
typeid
運算子傳回物件的類型訊息,該類型資訊是一個std::type_info
物件。可以使用 name()
成員函數取得型別名稱,可以使用 before()
和 after()
成員函數比較型別。
class Base { }; class Derived : public Base { }; int main() { Base obj; std::cout << typeid(obj).name() << std::endl; // 输出:Base // 检查 obj 是否属于 Derived 类型 if (typeid(obj).before(typeid(Derived))) { std::cout << "obj is not a Derived object" << std::endl; } }
使用 RTTI 的注意事項
實戰案例
場景:有一組形狀(例如圓形、矩形和三角形),需要根據它們的類型執行不同的操作。
程式碼:
class Shape { public: virtual void draw() = 0; }; class Circle : public Shape { public: void draw() override { std::cout << "Drawing a circle" << std::endl; } }; class Rectangle : public Shape { public: void draw() override { std::cout << "Drawing a rectangle" << std::endl; } }; class Triangle : public Shape { public: void draw() override { std::cout << "Drawing a triangle" << std::endl; } }; int main() { std::vector<Shape*> shapes{new Circle, new Rectangle, new Triangle}; for (auto shape : shapes) { // 使用 RTTI 获取形状类型 std::cout << "Drawing a " << typeid(*shape).name() << std::endl; // 根据类型调用相应的方法 shape->draw(); } }
輸出:
Drawing a Circle Drawing a Rectangle Drawing a Triangle
以上是C++ 泛型程式設計如何處理執行時間類型資訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!