我在结构operator=
上重载EqualTestBase
,operator=
采用与构造结构不同的参数。
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=
,还是有办法自动传递该功能?
答案 0 :(得分:5)
派生类具有隐式声明的复制赋值运算符,该运算符隐藏在基类中声明的运算符。您可以使用using
将其纳入范围:
struct EqualTestDerived : public EqualTestBase
{
EqualTestDerived(int one) : EqualTestBase(one) {}
using EqualTestBase::operator=;
};
答案 1 :(得分:2)
operator=
未被继承。如果一个类本身没有定义operator=
,那么编译器将为它合成一个(不管它的基类是否定义operator=
)。< / p>
如果您想要可以继承的东西(并且可以是虚拟的),您通常希望将其定义为具有不同名称的函数。这个函数的普遍接受的名称是clone
(尽管clone通常更像是一个复制构造函数,创建一个对象的新实例,而不仅仅是分配给现有的实例)。