Приемлемая практика программирования - конвертация и апкастинг - PullRequest
1 голос
/ 05 октября 2011

Является ли следующая приемлемая практика программирования:

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;
}

По какой причине это приемлемо / неприемлемо?

(Пожалуйста, не делайте очевидного предложения о создании оператора присваивания TestB в TestA - это вопрос о том, следует или не следует использовать операторы апскейтинга и / или преобразования таким образом).

Я также призываю оставлять отзывы в комментариях для вопросов upvote / downvotes, чтобы я мог улучшить свои вопросы в будущем.

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Оператор преобразования здесь не требуется, const TestA& вполне способен связываться с экземпляром производного класса (поскольку наследование общедоступно).

1 голос
/ 05 октября 2011

Оператор, который вы написали, на самом деле вообще не нужен.Язык делает это для вас автоматически, когда вы используете публичное наследование.Вы можете полностью удалить оператора, и он будет работать так же.А с апкастингом обычно все в порядке, вот как вы используете наследование, присваивая родительский указатель / ссылку производному экземпляру.

...