C++中基類對象安全轉換為衍生類別對象的方法

來源:互聯網
上載者:User

通常,為了實現多態性,我們將基類的指標或引用指向衍生類別對象。而當需要使用該衍生類別對象的特有方法時,可以通過將基類指標轉換為衍生類別指標以達到目的。這樣做總是合法的。也許在某些特殊情況下,需求剛好相反,我們需要將基類對象轉換為衍生類別對象。沒錯,是對象對象,不是指標。先看一下我們的基類和子類的範例程式碼吧!

//// CBase.h// #ifndef __C_BASE_H#define __C_BASE_Husing std::string;using std::cout;using std::endl;class CBase{protected :string _name;public :CBase(const string &name);virtual ~CBase(void);};inline CBase::CBase(const string &name) : _name(name){ NULL; }inline CBase::~CBase(void){ NULL; }#endif // __C_BASE_H

 好的,下面讓我們來看一下如何轉換:

//// main.c//#include <iostream>#include "CBase.h"#include "CDerived.h"int main(void){CBase base("father");CDerived derived("son");// 錯誤的調用, 基類 CBase 沒有方法 whoAmI// base.whoAmI(); // 調用衍生類別 CDerived 特有的方法 whoAmIderived.whoAmI();// 錯誤的轉換 // dynamic_cast<CDerived>(base)->whoAmI();// 基類轉換為衍生類別, 通過編譯,正常運行. static_cast<CDerived>(base).whoAmI(); return 0;} 

從上面的代碼可以看到,方法 whoAmI 是衍生類別 CDerived 所特有的,基類對象無法調用它。而意圖使用 dynamic_cast 動態地將基類對象 base 轉換為衍生類別對象,會導致編譯器報錯,因為運行時,基類對象 base 在記憶體中不可能包含衍生類別的屬性和方法。為什麼使用 static_cast 靜態地轉換卻可以呢?這條轉換語句並不是在任何情況下都可以通過編譯。事實上,運行時並沒有發生過轉換過程,我們只是做了一個小動作——以基類對象 base 為參照,另外構造了一個臨時衍生類別對象。先回顧一下運行結果:

I am son !
CDerived::CDerived(const CBase &base);
I am father !

然後再回頭看一下衍生類別 CDerived 的代碼,運行時下面的複製建構函式被執行了:

CDerived(const CBase &base);

 但與預設複製建構函式不同,它的參數為其基類對象的引用,這樣我們構造出來的衍生類別對象在記憶體中,其基類部分就與 base 完全一樣了。

inline CDerived::CDerived(const string &name) : CBase(name){ NULL; }

 因此,我們可以得出一個結論,在使用 static_cast 進行轉換時,編譯器隱式地為我們調用了複製建構函式。但是有一點需要注意,由於調用的複製建構函式參數類型與自身類型不同, 故我們必須親自編寫這個複製建構函式,如果沒有,編譯器將因為找不到合適的建構函式而報錯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.