继承的operator =不工作?

时间:2014-04-04 13:40:24

标签: c++ compiler-errors operator-overloading

我在结构operator=上重载EqualTestBaseoperator=采用与构造结构不同的参数。

struct EqualTestBase
{
 EqualTestBase(int one) {}

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

  return *this;
 }
};

它在基类上运行良好。但是从它派生的trival结构EqualTestDerived就像它没有operator=成员函数一样。

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=,还是有办法自动传递该功能?

2 个答案:

答案 0 :(得分:5)

派生类具有隐式声明的复制赋值运算符,该运算符隐藏在基类中声明的运算符。您可以使用using将其纳入范围:

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

答案 1 :(得分:2)

operator=未被继承。如果一个类本身没有定义operator=,那么编译器将为它合成一个(不管它的基类是否定义operator=)。< / p>

如果您想要可以继承的东西(并且可以是虚拟的),您通常希望将其定义为具有不同名称的函数。这个函数的普遍接受的名称是clone(尽管clone通常更像是一个复制构造函数,创建一个对象的新实例,而不仅仅是分配给现有的实例)。