色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

C++中動態類型的識別

汽車電子技術 ? 來源:嵌入式情報局 ? 作者:情報小哥 ? 2023-02-21 10:24 ? 次閱讀

大家好,我是情報小哥~

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
收藏 人收藏

    評論

    相關推薦

    C++打印類型名稱的分析與實現

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

    labview調用c++的取地址符對應labview什么數據類型

    調用c++動態鏈接庫,有一個參數是地址類&data,labview對應什么數據類型?急急急!!!!!!!!!!求大神幫忙
    發表于 08-18 11:47

    關于C++的函數重載機制

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

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

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

    C++靜態分析對泛型構件的識別與表示方法

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

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

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

    C++動態多態和靜態多態

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

    C++語法的外圍基礎

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

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

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

    現代C++之模板類型推導

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

    C++入門之string

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

    C++的引用和指針

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

    CC++編寫環境下LabVIEW如何調用動態庫?

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

    動態數組和C++ std::vector詳解

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

    C++實現類似instanceof的方法

    函數,可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java的instanceof的功能。 在 C++
    的頭像 發表于 07-18 10:16 ?574次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現類似instanceof的方法
    主站蜘蛛池模板: 碰超成人在线公开免费视频| 欧美激情视频二区| 欧美一区二区三区久久综| 午夜福利免费0948视频| 精品无人区麻豆乱码1区2| 欧美精品专区免费观看| 亚洲国产精品免费观看| 爱啪国产精品视频在线| 久久久精品成人免费看| 午夜国产精品视频| JIZZ学生13| 毛片手机在线| 亚洲综合视频| 国产精品…在线观看| 人妖和美女玩| 99精品在线播放| 久久综久久美利坚合众国| 亚洲AV无码乱码在线观看浪潮 | 第一次破女视频出血视频| 老女老肥熟国产在线视频| 亚洲精品久久久一区| 国产国产乱老熟女视频网站97| 欧美特级午夜一区二区三区| 一一本之道高清视频在线观看中文字幕 | 天堂tv免费tv在线tv香蕉| my pico未删减在线观看| 久久最新地址获取| 又黄又爽又无遮挡在线观看免费| 好大好硬好爽好深好硬视频| 羞羞影院午夜男女爽爽免费| 国产电影午夜成年免费视频| 天堂在线亚洲精品专区| 公和熄洗澡三级中文字幕| 少妇久久久久久被弄高潮| 成人精品综合免费视频| 色妺妺免费影院| 偷拍国产精品在线播放| 大胸美女洗澡扒奶衣挤奶| 日本久久中文字幕精品| 国产69精品久久久久乱码韩国 | 日本一区不卡在线播放视频免费|