2012-04-19 46 views
3

如何在基類中實現操作符重載,以獲得派生類對象的基類部分?我該如何在基類中實現對派生類對象的基類部分的操作符重載?

請參見本文的示例代碼並實現基類部分來實現對派生類對象*操作

class base { 
    int x; 
public: 

}; 

class der : public base { 
    int y; 
public: 
    const der operator*(const der& rh) { 
     der d; 
     d.y = y * rh.y; 
     return d; 
    } 

}; 
+0

@MikeSeymour:對我來說,'operator *'實現似乎只改變了在函數內部構造的單個值'd'。它不會修改'rh'和'* this'。 – 2012-04-19 10:25:53

+0

@FrerichRaabe:你說的對,我誤解了;我只是看到它不是'const',而是掩蓋了其餘部分。這一定早上過早。 – 2012-04-19 10:26:33

+0

'const der operator *(const der&rh){...}'應該讀取'der operator *(const der&rh)const {...}':您不希望結果是const,而是您的對象正在研究(*)。 – kay 2012-04-19 10:45:15

回答

-1

如下實施一個base::operator *

class base { 
protected: 
    int x; 
public: 
    base operator * (const base &rh) { 
    base b; 
    b.x = x * rh.x; 
    return b; 
    } 
}; 

,並調用它的,

der operator * (const der& rh) { 
    der d; 
    Base &b = d; // <---- assign a temporary reference of 'base' 
    b = static_cast<Base&>(*this) * rh; // <---- invoke Base::operator * 
    d.y = y * rh.y; 
    return d; 
} 
+0

@SteveJessop,我已經改變了我的帖子。實際上,由於只有一個變量'x',我試圖給出另一個直接在'der'中乘以'x'的解決方案。但後來我讓解決方案更通用。請檢查。 – iammilind 2012-04-19 11:23:57

1
class base { 
    int x; 
public: 
    base & operator *=(const base &rh) { 
     x*=rh.x; 
     return *this; 
    } 
    base operator *(const base &rh) { 
     base b = *this; 
     b*=rh; 
     return b; 
    } 
}; 

class der : public base { 
    int y; 
public: 
    using base::operator*; 
    der & operator*= (const der& rh) { 
     base::operator*=(rh); 
     y*=rh.y; 
     return *this; 
    } 
    const der operator*(const der& rh) { 
     der d = *this; 
     d*=rh; 
     return d; 
    } 

}; 
+0

這種方法意味着'*'不可交換; 'base()* der()'類型檢查,但是'der()* base()'不。此外,執行'base()* der()'可能會產生意想不到的結果(因爲操作符只會將'der'對象的'base''部分 - 可能不是你想要的)。 – 2012-04-19 10:41:43

+0

@FrerichRaabe我不能遵循你的觀點,用這種方法''base()* der()'和'der()* base()'無論如何都沒有區別。至於對'base()* der()'有意想不到的結果,我一般同意,但這是一個普遍的問題。這是否合理取決於你的類的語義,程序員負責控制訪問(通過'public'' private'等)來反映這些語義。 – enobayram 2012-04-19 11:30:06

+0

感謝您修復錯別字,我沒有一個方便的編譯器(我現在強制使用windows)。 – enobayram 2012-04-19 11:36:14

相關問題