可接受的编程习惯 - 转换和向上转换

时间:2011-10-05 14:09:57

标签: c++ conversion-operator upcasting

以下是可接受的编程实践:

class TestA
{
    protected:
        int A;

    public:
        TestA(){A = 10;}
        TestA &operator=(const TestA &ItemCopy)
        {
            A = ItemCopy.A;
            printf("A is: %d!\n",A);
            return *this;
        }
};

class TestB : public TestA
{
    protected:
        int B;

    public:
        TestB(){A = 20; B = 30;}
        operator const TestA&(){ return *this; } //Note returns reference, upcasts implicitly.
};

int main()
{
    TestA Test;
    TestB Test2;

    Test = Test2; //Calls Test2's (AKA TestB's) conversion operator
    return 0;
}

可接受/不可接受的原因是什么?

(请避免明确建议在TestA中创建TestB赋值运算符 - 这是关于是否应该以这种方式使用向上转换和/或转换运算符的问题。)

我也鼓励将反馈保留在问题upvote / downvotes的评论中,以便将来改进我的问题。

2 个答案:

答案 0 :(得分:2)

此处不需要转换运算符,const TestA&完全能够绑定到派生类的实例(因为继承是公共的)。

答案 1 :(得分:1)

实际上根本不需要你写的操作员。当您使用公共继承时,该语言会自动为您执行此操作。你可以完全删除操作符,它仍然可以正常工作。并且上传通常很好,这就是通过为派生实例分配父指针/引用来使用继承的方式。