Подтвердить что ты не робот

Вызывающие операторы базового класса... безопасные?

Является ли следующий шаблон ОК/безопасным? Или есть недостатки? (Я также использую его для операторов равенства)

Derived& operator=(const Derived& rhs)
{
    static_cast<Base&>(*this) = rhs;
    // ... copy member variables of Derived
    return *this;
}
4b9b3361

Ответ 1

Это хорошо, но гораздо более читаемый IMHO для вызова базового класса по имени:

Base::operator = (rhs);

Ответ 2

Да, это безопасно.

Другим синтаксисом для выполнения одного и того же может быть:

Base::operator=( rhs );

Ответ 3

Что лучше использовать

Base::operator=(rhs);

потому что если ваш базовый класс имеет чистый виртуальный метод, static_cast не разрешен.

class Base {
    // Attribute
    public:
        virtual void f() = 0;
    protected:
        Base& operator(const Base&);
}

class Derived {
    public:
        virtual void f() {};
        Derived& operator=(const Derived& src) {
            Base::operator=(src); // work
            static_cast<Base&>(*this) = src; // didn't work
        }
}