子类可以使用其父级的asignment运算符重载吗?

时间:2016-04-17 14:09:44

标签: c++ c++11 assignment-operator

我一直在问自己是否有可能创建一个基类,它具有子类可以使用的运算符重载。

示例(使用模板):

#include <cassert>

template<typename T>
struct Base {
    T value {};
    Base& operator=(const T& newVal) { this->value = newVal; return *this; }
};

template<typename T>
struct Child : Base<T> {
};

int main() {
    Child<int> ch {};
    assert(ch.value == 0);
    ch = 10;  // compilation error here
    assert(ch.value == 10);
}

我自己尝试使用编译错误。如果我想这样做,我该怎么办?这甚至是可能的,还是我必须使用虚拟并覆盖它(或者 什么是可能的?)

  

错误C2679:二进制'运算符':找不到哪个运算符需要a   “类型”类型的右侧操作数(或者没有可接受的   转化率)

     

编译器:MS Visual C ++ 2015

PS:请告诉我解决方案是否使代码变得丑陋。

1 个答案:

答案 0 :(得分:10)

每个班级都声明operator=。如果您没有明确地执行此操作,则会隐式声明运算符。那个(可能是隐含的)声明隐藏基础成员。要取消隐藏,您需要使用using声明:

template <typename T>
struct Child : Base<T>
{
    using Base<T>::operator=;
};