dynamic_cast 與 operator override 的應用
假設我有一個 Interface 如下
然後有一個 class 實作該 Interface
那在 operator== 函式中,如何將 other 從 IProperty& 轉換成 InstrumentType& 呢?
第一個想法是
不過得到的結果是
error C2682: cannot use 'dynamic_cast' to convert from 'const IProperty *' to 'PInstrumentType'
如果改用 Reference 的方式轉換
還是錯誤
error C2682: cannot use 'dynamic_cast' to convert from 'const IProperty &' to 'InstrumentType &'
最後測試的結果是要加上 const,也就是轉換前後都要一樣才行
先前也有想過用 const_cast 的方式,不過它的用途是把 const 的修飾功能移除 (變成非 const 變數) 所以要經過兩次轉換才能達到目的
經過這一次的實驗,對安全型別轉換 dynamic_cast 也有更深一層的認識
struct IProperty abstract
{
~IProperty() { }
virtual LPCTSTR toString() = 0;
virtual BOOL operator==(const IProperty& other) const = 0;
virtual BOOL operator!=(const IProperty& other) const = 0;
};
然後有一個 class 實作該 Interface
class InstrumentType : public IProperty
{
public:
enum INSTRUMENTTYPE
{
GUITAR,
BANJO,
DOBRO,
FIDDLE,
BASS,
MANDOLIN,
};
private:
INSTRUMENTTYPE m_enInstrumentType;
public:
InstrumentType(INSTRUMENTTYPE enInstrumentType);
~InstrumentType(void);
LPCTSTR toString();
BOOL operator==(const IProperty& other) const;
BOOL operator!=(const IProperty& other) const;
};
那在 operator== 函式中,如何將 other 從 IProperty& 轉換成 InstrumentType& 呢?
第一個想法是
PInstrumentType pOtherInstrumentType = dynamic_cast<PInstrumentType>(&other);
不過得到的結果是
error C2682: cannot use 'dynamic_cast' to convert from 'const IProperty *' to 'PInstrumentType'
如果改用 Reference 的方式轉換
InstrumentType& OtherInstrumentType = dynamic_cast<InstrumentType&>(other);
還是錯誤
error C2682: cannot use 'dynamic_cast' to convert from 'const IProperty &' to 'InstrumentType &'
最後測試的結果是要加上 const,也就是轉換前後都要一樣才行
BOOL InstrumentType::operator==(const IProperty& other) const { const InstrumentType& OtherInstrumentType = dynamic_cast<const InstrumentType&>(other); return (m_enInstrumentType == OtherInstrumentType.m_enInstrumentType); }
先前也有想過用 const_cast 的方式,不過它的用途是把 const 的修飾功能移除 (變成非 const 變數) 所以要經過兩次轉換才能達到目的
IProperty& other1 = const_cast<IProperty&>(other); InstrumentType& OtherInstrumentType = dynamic_cast<IinstrumentType&>(other1);
經過這一次的實驗,對安全型別轉換 dynamic_cast 也有更深一層的認識
- 轉換前後的修飾字元必須完全一致
- 除了指標外,也可以轉換 Reference
留言