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

標題: dynamic_cast淺析 [打印本頁]

作者: heicc    時間: 2015-1-5 14:27
標題: dynamic_cast淺析
廢話不多說,直接給結論:
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
結論1:
    基類指針強制變換為子類指針后,若基類指針指向的是一個基類實體,那么雖然編譯沒有問題,可完全無法實際使用,即轉換失敗!

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

情況3:
    base newBase = new A;
    A* newA = dynamic_cast< A* > ( newBase );  //OK
    newA->setA();  //OK
結論3:
    基類指針強制變換為子類指針后,若基類指針指向的是一個子類實體,轉換成功,調用子類虛函數(在這個實例里實際就是重構)沒有問題,不會發生調用錯函數的問題!

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

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

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

多日后再思考,又出現一個新想法,嘗試:
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;
結論6:
    在多重繼承的情況下,只要指針實際指向對象為子類對象,那么對于指向子類對象的基類指針,可以使用dynamic_cast在不同基類之間相互轉換,轉換后對應基類的虛函數特性得到保存。














歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲国产二区 | 日本特黄一级片 | 亚洲午夜在线 | 国产在线不卡 | 欧美成人免费在线视频 | 男女久久久 | 色婷婷av一区二区三区之e本道 | 亚洲一区二区久久 | 国产成人av网站 | 国产一级特黄aaa大片 | 日韩欧美国产精品 | 亚洲射| 男人的天堂久久 | www.日本在线观看 | 能看的av网站 | 狠狠操狠狠爱 | 精品亚洲一区二区 | 蜜桃精品一区二区 | 国产精品欧美日韩 | 天天躁日日躁狠狠很躁 | 国产欧美成人 | 国产在线视频91 | 欧美日韩亚洲一区二区三区 | 日韩成人免费视频 | 黄色片在线看 | 亚洲欧美在线观看视频 | 午夜在线播放 | 日本高清在线观看 | 日韩在线小视频 | 精品久久一区二区 | 中文字幕在线观看网址 | 国产一区一区 | 99精品欧美一区二区蜜桃免费 | 久久九九视频 | 国产精品五区 | 国产a一级| 免费黄色片视频 | 在线成人小视频 | 亚洲色妞| 亚洲一区二区三区在线播放 | 日本在线不卡视频 |