久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2151|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

dynamic_cast淺析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:3721 發(fā)表于 2015-1-5 14:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
廢話不多說,直接給結(jié)論:
class base
{
public:
    base(){}
    virtual ~base(){}
    int m_a;

    virtual void setA()
    {
      m_a = 0;
    }
};

class A : public base
{
public:
    A(){}
    virtual ~A(){}
    virtual void setA()
    {
      m_a = 1;
    }

    virtual void setAA()
    {
      m_a = 2;
    }

};

情況1:
    base newBase = new base;
    A* newA = dynamic_cast< A* > ( newBase );  //返回值為NULL,編譯無問題,但實際根本不能用
    newA->setAA();  //報錯,因為newA=NULL
結(jié)論1:
    基類指針強(qiáng)制變換為子類指針后,若基類指針指向的是一個基類實體,那么雖然編譯沒有問題,可完全無法實際使用,即轉(zhuǎn)換失敗!

情況2:
    base newBase = new A;
    A* newA = dynamic_cast< A* > ( newBase );  //OK
    newA->setAA();  //OK
結(jié)論2:
    基類指針強(qiáng)制變換為子類指針后,若基類指針指向的是一個子類實體,轉(zhuǎn)換成功,調(diào)用子類新增的成員函數(shù)沒有問題!

情況3:
    base newBase = new A;
    A* newA = dynamic_cast< A* > ( newBase );  //OK
    newA->setA();  //OK
結(jié)論3:
    基類指針強(qiáng)制變換為子類指針后,若基類指針指向的是一個子類實體,轉(zhuǎn)換成功,調(diào)用子類虛函數(shù)(在這個實例里實際就是重構(gòu))沒有問題,不會發(fā)生調(diào)用錯函數(shù)的問題!

情況4:
    A* newA = new A;
    base* newbase = dynamic_cast< base* > ( newA );  //OK
    newbase->setA();  //OK,由于是虛函數(shù)所以執(zhí)行的是A中的setA();  
結(jié)論4:
    偉大的虛函數(shù)功能并沒有因為強(qiáng)制轉(zhuǎn)換而消失!再次膜拜偉大的RTTI!

情況5:
    A* newA = new A;
    base* newbase = dynamic_cast< base* > ( newA );  
    newbase->setAA();  //成員函數(shù)不存在,無法編譯通過
結(jié)論5:
    不解釋。

最后的結(jié)論:
    在繼承體系中,上行轉(zhuǎn)換(子類->基類)dynamic_cast與static_cast功能完全一樣,有效且安全;
    下行轉(zhuǎn)換(基類->子類)則必須視基類實際指向的對象類型而定,只有基類指向的對象為子類類型時才有效且安全!

多日后再思考,又出現(xiàn)一個新想法,嘗試:
class   subBase
{public:
    subBase(){}
    virtual ~subBase(){}
    int m_b;
    virtual void setB()
    {
      m_b = 10;
    }
};

class   multiA : public base, public subBase
{
public:
    multiA(){};
    virtual ~multiA(){};
    virtual void setA()
    {
        m_a = 3;
    }
    virtual void setB()

    {
        m_b = 11;
    }
};

情況6:
    base* newbase = new multiA ;
    subBase* newsubbase = dynamic_cast< subBase* > ( newbase );  
    newsubbase->setB();  //OK m_b = 11;
結(jié)論6:
    在多重繼承的情況下,只要指針實際指向?qū)ο鬄樽宇悓ο螅敲磳τ谥赶蜃宇悓ο蟮幕愔羔槪梢允褂胐ynamic_cast在不同基類之間相互轉(zhuǎn)換,轉(zhuǎn)換后對應(yīng)基類的虛函數(shù)特性得到保存。









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频在线播放 | 欧美精品一区二区三区蜜桃视频 | 古装人性做爰av网站 | 免费一级做a爰片久久毛片潮喷 | 美女天天操| 五月婷婷激情 | 精品久久久久久久久久久久久久 | 国产在线www | 91.xxx.高清在线| 久久综合九九 | 日韩欧美天堂 | 久久久久无码国产精品一区 | 毛片入口 | 欧洲尺码日本国产精品 | 视频羞羞 | 精品国产乱码久久久久久丨区2区 | 亚洲精品一二三区 | 国产精品视频区 | 成人久久久 | 国产做爰| 美女黄视频网站 | 久久国产视频网 | 最新黄色在线观看 | 日本人麻豆 | 五月激情婷婷网 | 日本三级做a全过程在线观看 | 欧美区在线 | 国产成人小视频 | 99免费精品 | 日韩av成人在线观看 | 久久久久91 | 国产在线一区二区三区 | 成人高清视频在线观看 | 久久国产日韩 | h视频在线免费 | h视频在线播放 | 久久久久国产精品www | 午夜男人的天堂 | 欧美激情精品久久久久久 | 国产999精品久久久 精品三级在线观看 | 精品久久久久国产免费第一页 |