现在的位置: 首页 > 综合 > 正文

操作符重载函数多态性

2013年01月02日 ⁄ 综合 ⁄ 共 5334字 ⁄ 字号 评论关闭

内容:
    在一次coding过程中,遇到这样一个问题:能不能显式声明用virtual修饰操作符重载的函数?呵呵,提出的问题是
不是weird一点,但是此时并不否认有这样的想法也符合逻辑,好,那么我们来测试一下:
    #include <iostream>
    using std::cout;
    using std::endl;

    class LimitValue{
    public:
        LimitValue(int value = 0):value_(value){}
        LimitValue& operator=(const LimitValue& rhs){
            cout<<"In LimitValue,call operator=()"<<endl;
            value_ = rhs.value_;
            return *this;
        }
        void setValue(int value){
            value_ = value;
        }
        int getValue()const{
            return value_;
        }
    private:
        int value_;       
    };

    class Day:public LimitValue{
    public:
        Day(int days,int dvalue):LimitValue(days),selfValue_(dvalue){       
        }
        LimitValue& operator=(const LimitValue& rhs){
            cout<<"In Day,call operator=(const LimitValue&)"<<endl;
            return *this;
        }
        Day& operator=(const Day& rhs){
            cout<<"In Day,call operator=(const Day&)"<<endl;
            LimitValue::operator=(rhs);
            selfValue_ = rhs.selfValue_;
            return *this;
        }
        void setSelfValue(int value){
            selfValue_ = value;
        }
        int getSelfValue()const{
            return selfValue_;
        }
    private:
        int selfValue_;
    };

    void OutputValue(const Day& day)
    {
        cout<<"value="<<day.getValue()<<" selfValue="<<day.getSelfValue()<<endl;
    }

    int main(){
        Day d1(1,1);
        Day d2(2,2);      
        LimitValue* pLV1=&d1;
        LimitValue* pLV2=&d2; 

        //test1
        cout<<"Test1 begin:"<<endl;
        cout<<"Before d2=d1,d1:";
        OutputValue(d1);
        cout<<"Before d2=d1,d2:";
        OutputValue(d2);
        d2 = d1;   
        cout<<"After d2=d1,d1:";
        OutputValue(d1);
        cout<<"After d2=d1,d2:";
        OutputValue(d2);
        cout<<"Test1 end."<<endl<<endl;

        //test2
        d1.setValue(1);
        d1.setSelfValue(1);
        d2.setValue(2);
        d2.setSelfValue(2);
        cout<<"Test2 begin:"<<endl;
        cout<<"Before *pLV1 = *pLV2,d1:";
        OutputValue(d1);
        cout<<"Before *pLV1 = *pLV2,d2:";
        OutputValue(d2);
        *pLV1 = *pLV2;   
        cout<<"After *pLV1 = *pLV2,d1:";
        OutputValue(d1);
        cout<<"After *pLV1 = *pLV2,d2:";
        OutputValue(d2);
        cout<<"Test2 end."<<endl<<endl;
       
        //test3
        d1.setValue(1);
        d1.setSelfValue(1);
        d2.setValue(2);
        d2.setSelfValue(2);
        cout<<"Test3 begin:"<<endl;
        cout<<"Before d1 = *pLV2,d1:";
        OutputValue(d1);
        cout<<"Before d1 = *pLV2,d2:";
        OutputValue(d2);
        d1 = *pLV2;   
        cout<<"After d1 = *pLV2,d1:";
        OutputValue(d1);
        cout<<"After d1 = *pLV2,d2:";
        OutputValue(d2);
        cout<<"Test3 end."<<endl<<endl;

        //test4   
        d1.setValue(1);
        d1.setSelfValue(1);
        d2.setValue(2);
        d2.setSelfValue(2);
        cout<<"Test4 begin:"<<endl;
        cout<<"Before d2 = *pLV1,d1:";
        OutputValue(d1);
        cout<<"Before d2 = *pLV1,d2:";
        OutputValue(d2);
        d2 = *pLV1;   
        cout<<"After d2 = *pLV1,d1:";
        OutputValue(d1);
        cout<<"After d2 = *pLV1,d2:";
        OutputValue(d2);
        cout<<"Test4 end."<<endl<<endl;

        //test5   
        d1.setValue(1);
        d1.setSelfValue(1);
        d2.setValue(2);
        d2.setSelfValue(2);
        cout<<"Test5 begin:"<<endl;
        cout<<"Before *pLV1 = d2,d1:";
        OutputValue(d1);
        cout<<"Before *pLV1 = d2,d2:";
        OutputValue(d2);
        *pLV1 = d2;   
        cout<<"After *pLV1 = d2,d1:";
        OutputValue(d1);
        cout<<"After *pLV1 = d2,d2:";
        OutputValue(d2);
        cout<<"Test5 end."<<endl<<endl;

        //test6
        d1.setValue(1);
        d1.setSelfValue(1);
        d2.setValue(2);
        d2.setSelfValue(2);
        cout<<"Test6 begin:"<<endl;
        cout<<"Before *pLV2 = d1,d1:";
        OutputValue(d1);
        cout<<"Before *pLV2 = d1,d2:";
        OutputValue(d2);
        *pLV2 = d1;   
        cout<<"After *pLV2 = d1,d1:";
        OutputValue(d1);
        cout<<"After *pLV2 = d1,d2:";
        OutputValue(d2);
        cout<<"Test6 end."<<endl<<endl;
        return 0;
    }
    下面是该测试程序在VS2008下的输出结果:
    // Test1 begin:
    // Before d2=d1,d1:value=1 selfValue=1
    // Before d2=d1,d2:value=2 selfValue=2
    // In Day,call operator=(const Day&)
    // In LimitValue,call operator=()
    // After d2=d1,d1:value=1 selfValue=1
    // After d2=d1,d2:value=1 selfValue=1
    // Test1 end.

    // Test2 begin:
    // Before *pLV1 = *pLV2,d1:value=1 selfValue=1
    // Before *pLV1 = *pLV2,d2:value=2 selfValue=2
    // In LimitValue,call operator=()
    // After *pLV1 = *pLV2,d1:value=2 selfValue=1
    // After *pLV1 = *pLV2,d2:value=2 selfValue=2
    // Test2 end.

    // Test3 begin:
    // Before d1 = *pLV2,d1:value=1 selfValue=1
    // Before d1 = *pLV2,d2:value=2 selfValue=2
    // In Day,call operator=(const LimitValue&)
    // After d1 = *pLV2,d1:value=1 selfValue=1
    // After d1 = *pLV2,d2:value=2 selfValue=2
    // Test3 end.

    // Test4 begin:
    // Before d2 = *pLV1,d1:value=1 selfValue=1
    // Before d2 = *pLV1,d2:value=2 selfValue=2
    // In Day,call operator=(const LimitValue&)
    // After d2 = *pLV1,d1:value=1 selfValue=1
    // After d2 = *pLV1,d2:value=2 selfValue=2
    // Test4 end.

    // Test5 begin:
    // Before *pLV1 = d2,d1:value=1 selfValue=1
    // Before *pLV1 = d2,d2:value=2 selfValue=2
    // In LimitValue,call operator=()
    // After *pLV1 = d2,d1:value=2 selfValue=1
    // After *pLV1 = d2,d2:value=2 selfValue=2
    // Test5 end.

    // Test6 begin:
    // Before *pLV2 = d1,d1:value=1 selfValue=1
    // Before *pLV2 = d1,d2:value=2 selfValue=2
    // In LimitValue,call operator=()
    // After *pLV2 = d1,d1:value=1 selfValue=1
    // After *pLV2 = d1,d2:value=1 selfValue=2
    // Test6 end.

抱歉!评论已关闭.