中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

類型識別(五十四)

發布時間:2020-07-17 15:25:12 來源:網絡 閱讀:393 作者:上帝之子521 欄目:編程語言

        我們在面向對象中可能會出現這樣的情況:基類指針指向子類對象、基類引用成為子類對象的別名。如下

類型識別(五十四)

        靜態類型便指的是變量(對象)自身的類型,動態類型是指指針(引用)所指向對象的實際類型。基類指針是否可以強制類型轉換為子類指針取決于動態類型!下面的這種轉換方式是危險的

類型識別(五十四)

        那么我們在 C++ 中如何得到動態類型呢?解決方案便是利用多態:1、在基類中定義虛函數返回具體的類型信息;2、所有的派生類都必須實現類型相關的虛函數;3、每個類中的類型虛函數都需要不同的實現。

        下來我們就用代碼來分析

#include <iostream>
#include <string>

using namespace std;

class Base
{
public:
    virtual string type()
    {
        return "Base";
    }
};

class Derived : public Base
{
public:
    string type()
    {
        return "Derived";
    }
    
    void print()
    {
        cout << "I'm Derived." << endl;
    }
};

class Child : public Base
{
public:
    string type()
    {
        return "Child";
    }
};

void test(Base* b)
{
    if( b->type() == "Derived" )
    {
        Derived* d = static_cast<Derived*>(b);
        
        d->print();
    }
    
    cout << dynamic_cast<Derived*>(b) << endl;
}

int main()
{
    Base b;
    Derived d;
    Child c;
    
    test(&b);
    test(&d);
    test(&c);

    return 0;
}

        我們利用強制類型轉換的時候,首先得考慮指向的對象是不是和需要轉換的對象是一致的,如果是則進行轉換。否則會翻車。我們看看編譯結果

類型識別(五十四)

        我們看到只輸出了 Derived 類。我們之前說過,在進行繼承相關的轉換時,最好用 dynamic_cast 關鍵字,下面我們將 test 函數中的注釋去掉,再來編譯看看

類型識別(五十四)

        我們看到成功實現轉換的打印出了地址,沒成功的都為 0 了。我們利用多態成功的實現了動態類型的識別。但是有點小缺陷,就是必須從基類開始通過類型虛函數,所有的派生類都必須重寫類型虛函數,每個派生類的類型名必須唯一。

        那么在 C++ 中是通過了類型識別關鍵字的,typeid 關鍵字用于獲取類型信息typeid 關鍵字返回對應參數的類型信息,它返回一個 type_info 類對象,當 typeid 的參數為 NULL 時將拋出異常。typeid 的注意事項:當參數為類型時,返回靜態類型信息;當參數為變量時,不存在虛函數表則返回靜態類型信息,存在虛函數表則返回動態類型信息。

        下來還是以代碼為例來進行分析

#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;

class Base
{
public:
    virtual ~Base()
    {
    }
};

class Derived : public Base
{
public:
    void print()
    {
        cout << "I'm Derived." << endl;
    }
};

class Child : public Base
{
public:
    string type()
    {
        return "Child";
    }
};

void test(Base* b)
{
    const type_info& tb = typeid(*b);
    
    cout << tb.name() << endl;
}

int main()
{
    int i = 0;
    
    const type_info& tiv = typeid(i);
    const type_info& tvv = typeid(int);
    
    cout << (tiv == tvv) << endl;
    
    cout << endl;
    
    Base b;
    Derived d;
    
    test(&b);
    test(&d);

    return 0;
}

        我們打印 i 和 int 的信息應該是一致的,所以應該打印出 1。來看看編譯結果

類型識別(五十四)

        我們來看看如果不定義虛函數呢,看看編譯結果

類型識別(五十四)

        我們看到如果定義了虛函數的話,打印的便是動態類型的;沒定義的話,打印的便是靜態類型的。下來我們再用 BCC 編譯器來看看結果

類型識別(五十四)

        我們看到 typeid 關鍵字在不同的編譯器上打印的行為是有點區別的。通過對類型識別的學習,總結如下:1、C++ 中有靜態類型和動態類型的概念;2、利用多態能夠實現對象的動態類型識別;3、typeid 是專用于類型識別的關鍵字,它能夠返回對象的動態類類型信息。


        歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马龙县| 衡阳市| 沧州市| 秭归县| 沂南县| 平潭县| 缙云县| 平乡县| 文山县| 黎川县| 藁城市| 巫溪县| 景宁| 古丈县| 景谷| 栖霞市| 皮山县| 邢台县| 铁岭市| 广宁县| 双峰县| 娄底市| 增城市| 利川市| 上杭县| 肇东市| 镇沅| 饶平县| 双鸭山市| 民和| 屯留县| 文化| 江口县| 津市市| 金秀| 临湘市| 同江市| 息烽县| 阿尔山市| 游戏| 宁城县|