1

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

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 赋值运算符的明显建议——这是关于是否应该或不应该以这种方式使用向上转换和/或转换运算符的问题)。

我还鼓励在评论中留下反馈以进行问题赞成/反对,以便我将来改进我的问题。

4

2 回答 2

2

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

于 2011-10-05T14:14:23.243 回答
1

您编写的运算符实际上根本不需要。当您使用公共继承时,该语言会自动为您执行此操作。您可以完全删除操作员,它仍然会发挥相同的作用。向上转换通常很好,这就是通过将父指针/引用分配给派生实例来使用继承的方式。

于 2011-10-05T14:17:57.103 回答