gpt4 book ai didi

c++ - 调用基础运算符而不是派生运算符 - 正常行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:26 25 4
gpt4 key购买 nike

由于我目前正在使用 C++,我遇到了一个问题。代码如下:

#include        <iostream>

class Base {
public:
virtual ~Base() {}


virtual Base& operator=(const Base& o)
{
std::cout << "Base operator called" << std::endl;
return *this;
}
};

class Derived : public Base {
public:
virtual ~Derived() {}

virtual Base& operator=(const Base& o)

{
std::cout << "Derived operator called" << std::endl;
return *this;
}
};

int main(void)
{
Derived a;
Derived b;
Base& c = a;
Base& d = b;

a = b; // Base called
a = static_cast<Base>(b); // Derived called
a = d; // Derived called
c = d; // Derived called
return (0);
}

评论显示了我得到的输出。最后 3 个结果非常可预测,但我无法理解第一个。

如第二个 (static_cast) 所示,当右操作数是基类时调用 Derived::operator=。然而,g++ (4.5.3-r2, gentoo Linux) 成功理解它必须使用 'Base' 类,但不会沿着继承树向下走。

所以我期待 Derived::operator= 被调用,或者 g++ 提示没有“Derived& Derived::operator=(const Derived&)”。有人可以向我解释这种行为吗?谢谢!

最佳答案

Derived 类中有一个编译器生成 复制赋值,即operator=(Derived &),因为Derived: :operator=(Base const&) 不是 Derived 的复制赋值。如果您在代码中使用赋值,这不会阻止编译器生成复制赋值。

所以这一行:

 a = b;  // Base called     

调用编译器为 Derived 类生成的 operator=(Derived &),然后调用 operator=(Base const&)。因此 Base called 被打印出来。

实验:将此添加到 Derived 类:

Derived & operator=(Derived const & obj) : Base(obj)
{
std::cout << "copy-assignment called" << std::endl;
return *this;
}

现在,a=b 将导致打印:

Base called
copy-assignment called   

还要注意打印的顺序

希望能澄清您的疑问。


现在这个,

a = static_cast<Base>(b);  /// Derived called    

在功能上等同于此:

Base ___generated_tmp = static_cast<Base>(b);
a = ___generated_tmp;

表示,a = ___generated_tmp 调用 operator=(Base const&),因为 ___generated_tmp 的类型是 Base.

其余两个非常清楚,您似乎已经知道了。

关于c++ - 调用基础运算符而不是派生运算符 - 正常行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146643/

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