chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++中動態(tài)類型的識別

汽車電子技術 ? 來源:嵌入式情報局 ? 作者:情報小哥 ? 2023-02-21 10:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是情報小哥~

1、所要解決的問題

在前面的相同專輯文章中,跟大家介紹過虛函數(shù),其中提到了基類的指針可以指向派生類,同時基類的引用也可以成為派生類的別名。

比如是非常經典的例子:

#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;
}

這樣其輸出的結果如下:

圖片

由于存在虛函數(shù)的重寫,所以其函數(shù)調用都是跟隨傳入的對象類型,這就是多態(tài);當然如果此例子中Parent類中的print沒有virtual虛函數(shù)標識,則編譯器會認為傳入的就是父類指針,從而只會調用父類的成員。

而從Test1或者Test2對象內部看來并不能知道傳參是子類型還是父類型:

void Test1(Parent *ptr)
{
    Child* ptrChild = (Child *)ptr;
 
    ptrChild->dosomething(); //調用派生類成員
}

如上代碼如果傳入的參數(shù)是子類對象,那么函數(shù)內部用子類類型指向該對象是正常運行的,但如果此時傳入的是父類對象,而強制轉化為子類指針來使用,則程序就有可能出現(xiàn)未知錯誤。

所以這里也引出來兩個概念:靜態(tài)類型與動態(tài)類型

靜態(tài)類型: 即編譯期間所確定的變量類型;

動態(tài)類型: 在運行過程中指針或者引用所指向對象的實際類型。

基于上面的風險,我們急需有一種手段來識別變量的動態(tài)類型,以進行相應的處理,我們通常叫其為:RTTI(Run-Time Type Identification,運行時類型識別)

2、進行動態(tài)類型識別的方法

進行動態(tài)類型識別的方法挺多的,比如利用多態(tài)對派生類進行相應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;
}

其輸出結果如下:

圖片

結果看每種指針或者引用的類型均可以動態(tài)且正確的獲得識別,挺方便的。

最后有幾點需要注意下:

1、typeid返回值是名為type_info的標準庫類型的對象引用。

2、type_Info的name返回的是一個字符串,且其類名與實際程序中類型不一定是一致的,但是肯定是唯一標識字符串,通過上面輸出結果大家也是可以了解到的。

最 后

好了,這里小哥就簡單介紹了C++中動態(tài)識別機制的使用,本系列文章后續(xù)還會更新,記得關注學習哦。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 指針
    +關注

    關注

    1

    文章

    484

    瀏覽量

    71101
  • 虛函數(shù)
    +關注

    關注

    0

    文章

    8

    瀏覽量

    1765
  • 引用
    +關注

    關注

    0

    文章

    8

    瀏覽量

    7845
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C++打印類型名稱的分析與實現(xiàn)

    打印類型名稱,聽起來像是一個很簡單的需求,但在目前的C++當中,并非易事。
    發(fā)表于 10-20 14:08 ?1619次閱讀

    labview調用c++的取地址符對應labview什么數(shù)據(jù)類型?

    調用c++動態(tài)鏈接庫,有一個參數(shù)是地址類&data,labview對應什么數(shù)據(jù)類型?急急急?。。。。。。。。。∏蟠笊駧兔?/div>
    發(fā)表于 08-18 11:47

    關于C++的函數(shù)重載機制

    ,而且同類型的同名函數(shù)能夠更好地發(fā)揮多種功能.宏觀體現(xiàn)就是使用一個函數(shù)名字可以完成各種同類型但是不同細節(jié)的函數(shù)調用(例如,參數(shù)的類型不同,或者僅僅是多了一個控制量參數(shù)......).所以C++
    發(fā)表于 10-01 17:18

    C++的四種類型轉換分別是哪些?C++析構函數(shù)的作用是什么

    C++的四種類型轉換分別是哪些?C++析構函數(shù)的作用是什么?在C語言中關鍵字static主要
    發(fā)表于 12-24 06:57

    C++靜態(tài)分析對泛型構件的識別與表示方法

    本文從C++靜態(tài)分析的角度出發(fā),介紹了模板和泛型構件技術、一個C++靜態(tài)分析器實現(xiàn)對模板和基本泛型構件的分析和識別方法、以及一種基于UML 的泛型構件的表示方法。[關
    發(fā)表于 08-17 11:16 ?14次下載

    人臉識別C/C++源代碼

    人臉識別C/C++源代碼 將生物特征識別應用于人臉,實際上是包含兩個方面:第一,從圖像或視頻幀檢測人臉,即所謂的“人臉檢測”(face
    發(fā)表于 02-09 16:05 ?184次下載

    C++動態(tài)多態(tài)和靜態(tài)多態(tài)

    多態(tài)是 C++ 面向對象技術的核心機制之一包含靜態(tài)多態(tài)和動態(tài)多態(tài)它們之間有一定的相似性但是應用范圍不同該文論述了這種相似性并重點論述了以模板實現(xiàn)的靜態(tài)多態(tài)的應用范圍
    發(fā)表于 06-29 15:41 ?41次下載
    <b class='flag-5'>C++</b>的<b class='flag-5'>動態(tài)</b>多態(tài)和靜態(tài)多態(tài)

    C++語法的外圍基礎

    程序對內存空間的動態(tài)分配的頻繁程度要求簡化語言的相關語法的格式。C++語法規(guī)定new算符等效于C語言中mal1oc一類的函數(shù)功能;free算符等效于C語言中free一類的函數(shù)功能。其格
    發(fā)表于 03-15 16:55 ?10次下載

    c++ 之布爾類型和引用的學習總結

    c語言里面我們知道是沒有布爾數(shù)據(jù)類型的,而在C++添加了布爾數(shù)據(jù)類型(bool),它的取值是:true或者false(也就是1或者0),
    的頭像 發(fā)表于 12-24 18:03 ?790次閱讀

    現(xiàn)代C++之模板類型推導

    傳統(tǒng)C++,參數(shù)的類型都必須明確定義,這其實對我們快速進行編碼沒有任何幫助,尤其是當我們面對一大堆復雜的模板類型時,必須明確的指出變量的類型
    的頭像 發(fā)表于 03-02 16:18 ?1178次閱讀

    C++入門之string

    前一篇文章我們已經了解了C++的基本類型,C++還提供了很多抽象數(shù)據(jù)類型,例如字符串string,string包含多個字符,以及可變長度的
    的頭像 發(fā)表于 03-17 13:58 ?803次閱讀

    C++的引用和指針

    之前的文章我們已經介紹了C++的基本類型如int,bool和double等,除了基本類型C++還有一些更復雜的數(shù)據(jù)
    的頭像 發(fā)表于 03-17 14:00 ?852次閱讀

    CC++編寫環(huán)境下LabVIEW如何調用動態(tài)庫?

    C語言編寫的動態(tài)鏈接庫相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 這一導出語句,在C代碼
    發(fā)表于 06-11 09:15 ?9067次閱讀
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>編寫環(huán)境下LabVIEW如何調用<b class='flag-5'>動態(tài)</b>庫?

    動態(tài)數(shù)組和C++ std::vector詳解

    std::vector是C++的默認動態(tài)數(shù)組,其與array最大的區(qū)別在于vector的數(shù)組是動態(tài)的,即其大小可以在運行時更改。std::vector是封裝動態(tài)數(shù)組的順序容器,且該容器
    的頭像 發(fā)表于 07-19 11:07 ?1347次閱讀

    C++實現(xiàn)類似instanceof的方法

    函數(shù),可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現(xiàn)類似Java的instanceof的功能。 在 C++
    的頭像 發(fā)表于 07-18 10:16 ?894次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現(xiàn)類似instanceof的方法