具有派生类型参数的赋值运算符

时间:2011-09-09 06:54:29

标签: c++ inheritance operator-overloading

class A {
private:
    A& operator=(const A&);
};

class B : public A {
public:
    B& operator=(const A&) {
            return *this;
    }
};


int main() {

    B b1;
    B b2;

    b1 = b2;

    return 0;
}

这会给compilaton带来错误:

test.cpp: In member function 'B& B::operator=(const B&)':
test.cpp:16:5: error: 'A& A::operator=(const A&)' is private
test.cpp:19:20: error: within this context
test.cpp: In function 'int main()':
test.cpp:31:7: note: synthesized method 'B& B::operator=(const B&)'
first required here 
Build error occurred, build is stopped

由于B :: operator =(A&)具有非标准签名,编译器会生成它自己的B :: operator =(B&),它(尝试)调用A :: operator(A&),是私人的。

有什么方法可以让编译器也为B参数使用B :: operator =(A&)?

3 个答案:

答案 0 :(得分:7)

不确定。只需自己定义操作员并将呼叫转发至operator=(const A&)

class B : public A {
public:
    B& operator=(const A&) {
            return *this;
    }

    B& operator=(const B& other) {
        return *this = static_cast<const A&>(other);
    }
};

答案 1 :(得分:0)

这个问题是一个C ++陷阱,我与错误的概念气味相关联

你的问题可能是一个错误的问题,而且,没有完美的解决方案。尽量努力,在实施的解决方案中总会出现问题。

以下是对这个重复问题的一个(小)更完整的答案:How to use base class's constructors and assignment operator in C++?

顺便说一句,如果赋值运算符是私有的,这是一个明确的信号,表明基类的作者非常清楚实体语义值语义没有好好混合。相信他,他是对的!

答案 2 :(得分:0)

我认为尝试使用继承类型的运算符重载是一个坏主意。 在C ++中,我建议您在运算符重载时为每种支持的类型明确提供函数。

我不久前就进入了这个陷阱。如果您想了解经验丰富的 c ++人员如何使用此功能,我建议您查看std::vector<bool>的模板专精。

也许以上答案可以帮助您解决这个问题: C++ Abstract class operator overloading and interface enforcement question

另一种可能的解决方案是:

class B {
public:
  B& operator=(const A&) {
    return *this;
  }
};

class A {
private:
  A& operator=(const A&);
public:
  operator B() { /* do stuff to convert from A to B */ }
};

int main() {

  B b1;
  B b2;

  b1 = b2;

  return 0;
}