關於繼承體系下的操作符重載問題討論(二)

    我們在上一篇的時候引入了一個問題:當不爲我們的子類顯式提供操作符重載函數實現,那麼編譯器爲這個
類提供的操作符重載的默認實現版本是否會調用基類的操作符實現函數呢?帶着這個問題,我們依舊利用上一篇
的代碼進行測試,我們先註釋掉該子類的操作符實現函數:   
    class Day:public LimitValue{
    public:
        Day(int days,int selfData):LimitValue(days),selfValue_(selfData){}
        // Day& operator=(const Day& rhs){
        //      cout<<"In Day,call operator=(const Day&) "<<endl;           
        //      selfValue_ = rhs.selfValue_;
        //      return *this;
        // }   
        int getSelfValue()const{
            return selfValue_;
        }
    private:
        int selfValue_;
    };
    測試代碼我們原封不動,輸出結果如下:
    // Before assign,d1:value_=1 selfValue=1
    // d2:value_=2 selfValue=2
    // In LimitValue,call operator=()
    // After assign,d1:value_=1 selfValue=1
    // d2:value_=1 selfValue=1
    wow,看來運行結果依然良好!它調用了基類的操作符實現體,顯然符合我們的一般規律,呵呵,好了,我們現在
在前一篇的結論基礎了在進行完善一下:
    (1)如果你顯式地實現子類的操作運算符函數,那麼在你的實現體內你需要實現其父類該操作的功能.因爲此
時的編譯器不會爲你自動調用父類相應的操作符函數.
    (2)如果你沒有聲明子類的操作運算符函數,那麼當某地方用到該類的操作符時,編譯器會自動爲該類生成其
默認的操作符函數實現版本,該實現版本內部會自動調用該類父類的操作符函數(當然如果父類沒有提供明確聲明
那麼它將調用編譯器父類該操作符的默認實現版本).

發佈了62 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章