gpt4 book ai didi

c++ - 这两种调用基类拷贝赋值的方式有什么区别呢?

转载 作者:搜寻专家 更新时间:2023-10-30 23:56:57 25 4
gpt4 key购买 nike

假设我有以下内容:

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);

为什么你会选择一个而不是另一个?两者有什么区别?

编辑

我的问题的初始示例是无效的,与我打算问的问题相去甚远。我为这个错误道歉。我更新了上面的示例以使其更加清晰。

最佳答案

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=是根据复制构造函数后跟交换实现的:

B& B::operator=(B other) { 
other.swap(*this);
return *this;
}

服用 B按值调用 B s 为我们复制构造函数。如果B具有右值复制构造函数此赋值运算符可用于右值以及仅移动 B (例如,如果 B 有一个 std::unique_ptr 成员)。

关于c++ - 这两种调用基类拷贝赋值的方式有什么区别呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com