C++的子類與父類強制轉換產生的問題


近日,在項目的一個類中如果碰上想要將子類強制轉換成父類,然后再調用其父類版本的virtual虛函數。

就會出現gcc編譯錯誤提示:error: ld returned 1 exit status

gcc提示原因:在link過程中,發現了無法找到的reference symbol, 該reference symbol是此父類的拷貝構造函數。

由此,我推斷問題的原因是:在子類轉換成父類的過程中,默認地調用了父類的拷貝構造函數。而由於項目中針對大部分類都使用了DISALLOW_COPY_AND_ASSIGN(XXX); 這個宏聲明卻沒實現,相當於禁止了拷貝構造函數。該宏的定義如下: 

#define DISALLOW_COPY_AND_ASSIGN(ClassName) \

ClassName(const ClassName&); \
void operator=(const ClassName&)

 

解決方法是: 轉換其類型,但是不讓其使用拷貝構造函數(copy constructor),代碼如下:

static_cast<Parrent&>(*this); 

此處使用了Parrent& 而不是 static_cast<Parrent>(*this) , 使用引用而不是類,可以避免copy新的對象, 自然就避免了調用其拷貝構造函數。

 

參考:

1. http://stackoverflow.com/questions/9084835/why-does-static-castthis-to-a-base-class-create-a-temporary-copy

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM