假设我有以下内容:
class A
{
public:
A& operator= (A const& other)
{
return *this;
}
};
class B : public A
{
public:
B& operator= (B const& other)
{
static_cast<A&>(*this) = static_cast<A const&>(other);
// or...
A::operator=(other);
return *this;
}
};
要调用A
版本的复制赋值运算符,我可以这样做:
static_cast<A&>(*this) = static_cast<A const&>(other);
或者:
A::operator=(other);
为什么选择一个而不是另一个?这两者有什么不同?
我的问题的最初例子是无效的,与我打算提出的问题相去甚远。我为这个错误道歉。我已经更新了上面的例子,以便更清楚。
答案 0 :(得分:7)
static_cast<A&>(*this).foo()
仍调用foo
的派生版本。这只是通过基类引用调用虚函数。
A::foo()
关闭虚拟调度并调用类foo
中实现的A
,而不是派生类。
如果operator=
中的A
不是虚拟的,则static_cast<A&>(*this) = static_cast<A const&>(other)
是另一种说法A::operator=(other)
的方式(无需向上转发other
,因为派生到基准参考转换是隐含的)。他们做同样的事 - 打电话给A::operator=
。
通常,operator=
是根据复制构造函数实现的,后跟swap:
B& B::operator=(B other) {
other.swap(*this);
return *this;
}
按值B
为我们调用B
的复制构造函数。如果B
具有r值复制构造函数,则此赋值运算符可以与r值一起使用,也可以仅移动B
(如果B
,则std::unique_ptr
具有{{1}} }成员)。
答案 1 :(得分:0)
如果你想要两个类(A和B)的A赋值运算符,只是不要在B类中实现它。