Унаследованный оператор = не работает?

0

Я перегружаю operator= на struct EqualTestBase, а operator= принимает разные параметры, чем используется для построения структуры.

struct EqualTestBase
{
 EqualTestBase(int one) {}

 EqualTestBase& operator=(std::string two)
 {
  //stuff

  return *this;
 }
};

Он отлично работает на базовом классе. Но построенная из него структура trival, EqualTestDerived, действует так, как будто у нее нет функции operator= member.

struct EqualTestDerived : public EqualTestBase
{
 EqualTestDerived(int one) : EqualTestBase(one) {}
};

void test()
{
 EqualTestBase basetest(0);
 basetest = "test"; //this is fine, compiles

 EqualTestDerived derivedtest(0);
 derivedtest = "test"; //this does not compile, says there is no constructor that takes type const char[5]
}

Должен ли я переопределять operator= для всех производных структур, или есть способ автоматически передать эту функциональность?

Теги:
operator-overloading
compiler-errors

2 ответа

5
Лучший ответ

Производный класс имеет неявно объявленный оператор присваивания копии, который скрывает тот, который объявлен в базовом классе. Вы можете использовать с using, чтобы привести его в область видимости:

struct EqualTestDerived : public EqualTestBase
{
    EqualTestDerived(int one) : EqualTestBase(one) {}
    using EqualTestBase::operator=;
};
  • 0
    Я думаю, следует также упомянуть, что иерархия присваивания и класса - это две концепции, которые обычно плохо сочетаются. Как правило, если у класса есть оператор присваивания, то это не базовый класс, и наоборот.
  • 0
    @ChristianHackl: Если наследование для полиморфизма, то вы правы; но это не тот случай. (Можно утверждать, что композиция была бы более идеологически чистой, хотя и менее удобной, чем неполиморфное наследование; но такие философские размышления довольно неуместны для такого простого вопроса, как этот).
Показать ещё 1 комментарий
2

operator= не наследуется. Если класс не определяет operator= сам, компилятор будет синтезировать его для него (независимо от того, что его базовый класс определяет operator=).

Если вы хотите что-то, что может быть унаследовано (и может быть виртуальным), вы обычно хотите определить его как функцию с другим именем. Общепринятое имя для такой функции является clone (хотя клон обычно больше похож на конструктор копирования, создавая новый экземпляр объекта, а не просто присваивая существующий).

  • 0
    Конечно это наследуется. Это просто скрыто неявно объявленной версией в производном классе.
  • 0
    @MikeSeymour: Хотя это технически верно, мне кажется, что в основном это игра в слова, которая вряд ли окажет реальную помощь ОП.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню