很多很多关于继承
operator=
的帖子,通常的答案是“它被隐式定义的继承所掩盖,如果你知道自己在做什么,请使用 using Base::operator=
”。
这是一个希望略有不同的问题。 考虑以下情况,其中基类
A
知道派生类的确切类型:
#include <iostream>
template <typename E>
struct A {
E& operator= (const E& other) {
std::cout << "A<E>::op=\n";
return *(E*)this;
}
E& operator= (E& other) {
std::cout << "A<E>::op no const=\n";
return *(E*)this;
}
};
struct B : public A<B> {
using A<B>::operator=;
};
int main () {
B x, y;
x = y;
const B z;
x = z;
}
在
main
函数中,当调用 x = y
时,会调用带有 E& A<E>::operator= (E& other)
的方法 E = B
,正如预期的那样。 但是,x = z
不 会调用 E& A<E>::operator= (const E& other)
。
为什么? (请注意,这是一个关于行为的问题,而不是风格的问题:-))
为什么?
因为
x = z
使用了隐式定义的
B& B::operator=(const B&)
和
A& A::operator=(const A&)