gpt4 book ai didi

c++ - operator= 在子类中

转载 作者:行者123 更新时间:2023-11-27 22:30:24 24 4
gpt4 key购买 nike

我对如何解决以下问题感到很困惑(在 SO 和 google 上搜索都没有太大帮助)。

假设我们有一个定义基本运算符的类和一个简单的 vector 作为唯一的数据,并且只在继承的类中添加额外的方法:

class Foo
{
public:
// this only copies the data
Foo& operator=(const Foo& foo);

// do something that computes a new Foo from *this
Foo modifiedFoo();

//..
private:
std::vector<int> data;
}

class Bar: public Foo
{
public:
void someNewMethod();
//..
// no new data
}

继承现在确保 operator= 在 bar1 = bar2 的情况下做正确的事情。但是从数据的角度来看,BarFoo 基本上是一样的,所以我希望可以都写

Foo foo;
Bar bar;

foo = bar; // this ...
bar = foo; // .. and this;

更具体地说

bar = foo.modifiedFoo();

[编辑:顺便说一句,这显然也行不通......

bar1 = bar2.modifiedFoo();

]

我认为这就像在 Bar 中添加另一个 Bar& operator=(const Foo & foo) 一样简单,但不知何故这被忽略了(我没有无论如何,如果我派生越来越多的类怎么办?)

那么正确的做法是什么?

谢谢!!抱歉,如果之前有人问过这个问题。

最佳答案

这就是众所周知的切片问题:

foo = bar;

基本上 bar 对象就好像它只是一个 Foo。
然后将 bar 的 Foo 部分复制到 foo 对象上(从而切掉任何关于它是 Bar 的知识)。

因为编译器自动为类定义了一个赋值运算符。以下内容无效:

bar = foo; 

在这里,编译器看到 bar 是“Bar”类型,并寻找赋值运算符。它发现编译器在“Bar”中生成了一个并尝试应用它(Foo 中的那个现在被隐藏了)。编译器生成的赋值运算符如下所示:

Bar& operator=(Bar const& rhs)

因此上面的行不匹配,赋值失败。

关于c++ - operator= 在子类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3215756/

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