近日,在項目的一個類中如果碰上想要將子類強制轉換成父類,然后再調用其父類版本的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