如何在层次结构中实现运算符使用?

umb*_*JYL 3 c++ inheritance operator-overloading c++11

我有一个Base包含几个派生类的类:

class Base {
private:
    long id;
public:
    Base() {}
    ~Base() {}
    Base &operator = (long temp) {
        id = temp;
        return *this;
    }
};

template <class C>
class Temp1 : public Base {
public:
    Temp1() {}
    ~Temp1() {}
    //do something;
};

template <class C>
class Temp2 : public Base {
public:
    Temp2() {}
    ~ Temp2() {}
    //do something;
};

class Executor1 : public Temp1<int> {
public:
    Executor1() {}
    ~Executor1() {}
};

class Executor2 : public Temp2<char> {
public:
    Executor2() {}
    ~Executor2() {}
};
Run Code Online (Sandbox Code Playgroud)

我希望这些课程得到支持operator =.
例如:

int main()
{
    long id1 = 0x00001111, id2 = 0x00002222;
    Executor1 exec1;
    Executor2 exec2;

    exec1 = id1;  //exec2.id = id1;
    exec2 = id2;  //exec2.id = id2;
}
Run Code Online (Sandbox Code Playgroud)

operator =Base其声明中定义Base &operator = (long);.

但是有一个问题显然是=无法派生类.所以我必须定义operator =完全对每个人做同样的事情Executor.

如何以Base更好的方式处理这个案子?

Jul*_*anH 6

您必须将= -operator拉入类的范围:

class Base
{
public:
    long id;

    Base& operator=(long id)
    {
        this->id = id;
        return *this;
    }
};

class Temp2
    : public Base
{
public:
    using Base::operator=;
};
Run Code Online (Sandbox Code Playgroud)

你必须将operator =拉入范围,因为隐式生成的复制操作符= Temp2隐藏了operator = of Base.从@Angew的评论中得到了这个暗示.

  • @JulianH不,这绝对不是在复制ctor.它只是该类具有隐式定义的`operator =`,它隐藏了继承的`operator =`.这就是必须将其纳入范围的原因. (4认同)
  • @umbreLLaJYL - 分段错误是由程序中的错误引起的.在代码中,您不会在此处显示.这回答了你问*的问题.如果您有关于seg错误的新的无关问题,可以使用另一个[mcve]发布另一个问题. (2认同)