C++ - RTTI(RunTime Type Information)运行时类型信息 详解
RTTI, RunTime Type Information, 運行時類型信息, 是多態的主要組成部分,?
通過運行時(runtime)確定使用的類型, 執行不同的函數,復用(reuse)接口.
dynamic_cast<>可以 使基類指針轉換為派生類的指針, 通過判斷指針的類型, 可以決定使用的函數.
typeid(), 可以判斷類型信息, 判斷指針指向位置, 在多態中, 可以判斷基類還是派生類.
代碼:
/*
?* test.cpp
?*
?* ?Created on: 2014.04.22
?* ? ? ?Author: Spike
?*/
?
/*eclipse cdt, gcc 4.8.1*/
?
#include <iostream>
#include <typeinfo>
?
?
using namespace std;
?
class Base {
public:
?? ?virtual void fcnA() {
?? ??? ?std::cout << "base" << std::endl;
?? ?}
};
?
class Derived : public Base {
public:
?? ?virtual void fcnB() {
?? ??? ?std::cout << "derived" << std::endl;
?? ?}
};
?
void fcnC(Base* p) {
?? ?Derived* dp = dynamic_cast<Derived*>(p);
?? ?if (dp != NULL)
?? ??? ?dp->fcnB();
?? ?else
?? ??? ?p->fcnA();
}
?
void fcnD(Base* p) {
?? ?if (typeid(*p) == typeid(Derived)) {
?? ??? ?Derived* dp = dynamic_cast<Derived*>(p);
?? ??? ?dp->fcnB();
?? ?} else
?? ??? ?p->fcnA();
}
?
int main(void) {
?? ?Base* cp = new Derived;
?? ?std::cout << typeid(cp).name() << std::endl;
?? ?std::cout << typeid(*cp).name() << std::endl;
?? ?std::cout << typeid(&(*cp)).name() << std::endl;
?? ?fcnC(cp);
?? ?fcnD(cp);
?? ?Base* dp = new Base;
?? ?fcnC(dp);
?? ?fcnD(dp);
?
?? ?return 0;
}
輸出:
P4Base
7Derived
P4Base
derived
derived
base
base
以上代碼只是示例,?
具體使用時, 避免使用dynamic_cast<>和typeid()去判斷類型, 直接通過多態即可.
注意多態的綁定只能通過指針, 如fcnC(Base*), 或引用, 如fcnD(Base&), 實現動態綁定,
?兩者效果相同;
都會根據輸入的類型,動態綁定虛函數(virtual function).
---------------------?
作者:SpikeKing?
來源:CSDN?
原文:https://blog.csdn.net/caroline_wendy/article/details/24369987?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的C++ - RTTI(RunTime Type Information)运行时类型信息 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ exception 类继承结构图
- 下一篇: ON_MESSAGE,ON_COMMAN