參考於
注意:typeid是操作符,不是函式。這點與sizeof類似)
rtti(run-timetype identification, 執行時型別識別),它提供了執行時確定物件型別的方法。它使程式能夠獲取由基指標或引用所指向的物件的實際派生型別,即允許「用指向基類的指標或引用來操作物件」的程式能夠獲取到「這些指標或引用所指物件」的實際派生型別。
在c++中,為了支援rtti提供了兩個操作符:dynamic_cast和typeid
dynamic_cast允許執行時刻進行型別轉換,從而使程式能夠在乙個類層次結構中安全地轉化型別
typeid是c++的乙個關鍵字,等同於sizeof這類操作符。typeid操作符的返回結果是名為type_info的標準庫型別的物件的引用。type_info的name成員函式返回c-style的字串。
如果表示式的型別是類型別且至少包含有乙個虛函式(由於此時的基類不具有多型性),則typeid操作符返回表示式的動態型別,需要在執行時計算,否則,typeid操作符返回表示式的靜態型別,在編譯時就可以計算。
type_info類提供了public虛 析構函式,以使使用者能夠用其作為基類。它的預設建構函式和拷貝建構函式及賦值操作符都定義為private,所以不能定義或複製type_info型別的物件。程式中建立type_info物件的唯一方法是使用typeid操作符(由此可見,如果把typeid看作函式的話,其應該是type_info的 友元)。type_info的name成員函式返回c-style的字串,用來表示相應的型別名,但務必注意這個返回的型別名與程式中使用的相應型別名並不一定一致(往往如此,見後面的程式),這具體由編譯器的實現所決定的,標準只要求實現為每個型別返回唯一的字串。
(1)、typeid運算子允許在執行時確定物件的型別;
(2)、typeid的結果是const type_info&;
(3)、typeid運算子在應用於多型類型別的左值時執行執行時檢查,其中物件的實際型別不能由提供的靜態資訊確定;
(4)、typeid也可在模板中使用以確定模板引數的型別;
(5)、typeid是操作符,不是函式,執行時獲知變數型別名稱;
(6)、要使用typeid,首先要確保編譯器開啟了執行時型別檢查(rtti)。
#ifndef _typeinfo
#define _typeinfo
#include
namespace std
bool before
(const type_info& __arg) const
bool operator==
(const type_info& __arg) const
bool operator!=
(const type_info& __arg) const
virtual bool __is_pointer_p
() const;
virtual bool __is_function_p
() const;
protected:
const char *__name;
explicit type_info
(const char *__n)
:__name
(__n)
private:
type_info& operator=
(const type_info&);
type_info
(const type_info&);
};}// extern "c++"
#endif
#include
using namespace std;
class base
;//此處有虛函式};
class derived
:public base
;class father};
class son
: public father
;int main()
有虛函式:class base
* 沒有虛函式:class father
* 兩種都是列印的是基類的指標型別
有虛函式:class derived 沒有虛函式:class father 有虛函式列印的會根據執行時p所指向的實際型別去計算
有虛函式:class base 沒有虛函式:class father both same
有虛函式:class derived 沒有虛函式:class son both same
有虛函式:class base
* 沒有虛函式:class father
* both same
有虛函式:class derived
* 沒有虛函式:class son
* both same
請按任意鍵繼續.
..
定義了一種base基類帶虛函式,繼承於它的子類derived。此實現方式具有多型性,在執行typeid().name()函式時,會動態的計算。如typeid§.name(),列印的是class base *,當執行typeid(*p).name()時,列印的是classderived,因為此時基類具有多型性,列印的是p真正所指向的物件,而本例中p指向的是派生類物件,現在p真正指向的是其子類derived,所以列印的是class derived。*因此表示式typeid(p) == typeid(derived)為真。
第二種是不帶虛函式的基類father,所以執行的結果本質是沒有區別的。
基類指標指向派生類
include class a virtual void vt private void a2 protected void a3 class b public a virtual void vt private void b2 protected void b3 int main 結論 1 對於派...
基類指標指向派生類物件
成員函式一般化三個結論 include using std cout using std endl class employee class dev public employee int main 1.如果以 基類指標 指向 派生類物件 那麼經由該指標只能呼叫基類所定義的函式 2.如果以 派生類指...
基類指標指向派生類物件
父類子類指標函式呼叫注意事項 1,如果以乙個基礎類指標指向乙個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾...