Ответ 1
Это хорошо, но гораздо более читаемый IMHO для вызова базового класса по имени:
Base::operator = (rhs);
Является ли следующий шаблон ОК/безопасным? Или есть недостатки? (Я также использую его для операторов равенства)
Derived& operator=(const Derived& rhs)
{
static_cast<Base&>(*this) = rhs;
// ... copy member variables of Derived
return *this;
}
Это хорошо, но гораздо более читаемый IMHO для вызова базового класса по имени:
Base::operator = (rhs);
Да, это безопасно.
Другим синтаксисом для выполнения одного и того же может быть:
Base::operator=( rhs );
Что лучше использовать
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
}
}