Я перегружаю 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=
для всех производных структур, или есть способ автоматически передать эту функциональность?
Производный класс имеет неявно объявленный оператор присваивания копии, который скрывает тот, который объявлен в базовом классе. Вы можете использовать с using
, чтобы привести его в область видимости:
struct EqualTestDerived : public EqualTestBase
{
EqualTestDerived(int one) : EqualTestBase(one) {}
using EqualTestBase::operator=;
};
operator=
не наследуется. Если класс не определяет operator=
сам, компилятор будет синтезировать его для него (независимо от того, что его базовый класс определяет operator=
).
Если вы хотите что-то, что может быть унаследовано (и может быть виртуальным), вы обычно хотите определить его как функцию с другим именем. Общепринятое имя для такой функции является clone
(хотя клон обычно больше похож на конструктор копирования, создавая новый экземпляр объекта, а не просто присваивая существующий).