大家好,我是情報小哥~
1、所要解決的問題
在前面的相同專輯文章中,跟大家介紹過虛函數,其中提到了基類的指針可以指向派生類,同時基類的引用也可以成為派生類的別名。
比如是非常經典的例子:
#include
using namespace std;
class Parent
{
public:
virtual void print(void)
{
cout<<"Parent print"<class Child: public Parent
{
public:
void print(void)
{
cout<<"child print"<void Test1(Parent *ptr)
{
ptr->print();
}
void Test2(Parent& p)
{
p.print();
}
int main(int argc, char** argv) {
Child child;
Parent parent;
Test1(&child);
Test1(&parent);
Test2(child);
Test2(parent);
return 0;
}
這樣其輸出的結果如下:
由于存在虛函數的重寫,所以其函數調用都是跟隨傳入的對象類型,這就是多態;當然如果此例子中Parent類中的print沒有virtual虛函數標識,則編譯器會認為傳入的就是父類指針,從而只會調用父類的成員。
而從Test1或者Test2對象內部看來并不能知道傳參是子類型還是父類型:
void Test1(Parent *ptr)
{
Child* ptrChild = (Child *)ptr;
ptrChild->dosomething(); //調用派生類成員
}
如上代碼如果傳入的參數是子類對象,那么函數內部用子類類型指向該對象是正常運行的,但如果此時傳入的是父類對象,而強制轉化為子類指針來使用,則程序就有可能出現未知錯誤。
所以這里也引出來兩個概念:靜態類型與動態類型
靜態類型: 即編譯期間所確定的變量類型;
動態類型: 在運行過程中指針或者引用所指向對象的實際類型。
基于上面的風險,我們急需有一種手段來識別變量的動態類型,以進行相應的處理,我們通常叫其為:RTTI(Run-Time Type Identification,運行時類型識別)
2、進行動態類型識別的方法
進行動態類型識別的方法挺多的,比如利用多態對派生類進行相應ID的標識等等,不過推薦還是采用typeid的方式。
typeid關鍵字能夠獲得任意變量的類型信息,也是C++專門提供用于類型識別的方式。
那么下面我們就用一個例程在看看typeid如何使用的:
#include
#include
using namespace std;
class Parent
{
public:
virtual void print(void)
{
cout<<"Parent print"<class Child: public Parent
{
public:
void print(void)
{
cout<<"child print"<void dosomething(void)
{
cout<<"dosomething"<void Test1(Parent *ptr)
{
if( typeid(*ptr) == typeid(Child) ) //具體使用方式 Child
{
Child* ptrChild = dynamic_cast(ptr);
cout<<"**Dynamic Type: "<<"Child"<dosomething();
}
else if( typeid(*ptr) == typeid(Parent) ) //Parent
{
cout<<"**Dynamic Type: "<<"Parent"<print();
}
}
void Test2(Parent& p)
{
if( typeid(p) == typeid(Child) ) //具體使用方式 Child
{
Child& ptrChild = (Child&)p;
cout<<"**Dynamic Type: "<<"Child"<dosomething();
}
else if( typeid(p) == typeid(Parent) ) //Parent
{
cout<<"**Dynamic Type: "<<"Parent"<print();
}
}
int main(int argc, char** argv) {
Child child;
Parent parent;
Test1(&child);
Test1(&parent);
cout<Test2(child);
Test2(parent);
cout<const type_info& tparent = typeid(parent);
const type_info& tchild = typeid(child);
cout<name()<name()<return 0;
}
其輸出結果如下:
結果看每種指針或者引用的類型均可以動態且正確的獲得識別,挺方便的。
最后有幾點需要注意下:
1、typeid返回值是名為type_info的標準庫類型的對象引用。
2、type_Info的name返回的是一個字符串,且其類名與實際程序中類型不一定是一致的,但是肯定是唯一標識字符串,通過上面輸出結果大家也是可以了解到的。
最 后
好了,這里小哥就簡單介紹了C++中動態識別機制的使用,本系列文章后續還會更新,記得關注學習哦。
-
指針
+關注
關注
1文章
480瀏覽量
70551 -
虛函數
+關注
關注
0文章
8瀏覽量
1698 -
引用
+關注
關注
0文章
8瀏覽量
7730
發布評論請先 登錄
相關推薦
評論