gpt4 book ai didi

c++ - 在包装器中保存抽象值对象和继承的使用

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

我有关于 C++ 类继承的问题。我有一个具有虚方法的类,例如:

class IFoo {
public:
virtual int sayFoo() = 0;
};

我有几个实现,例如:

class Foo1: public IFoo {
public:
virtual int sayFoo() {
return 1;
}
};

class Foo2: public IFoo {
public:
virtual int sayFoo() {
return 2;
}
};

我想将 IFoo 实例保存在一个虚拟容器类(就像一种包装器)中,以暴露与 IFoo 相同的接口(interface):

class DummyWrapper : public IFoo {
public:
DummyWrapper(IFoo& foo): foo{foo} {}
virtual int sayFoo() {
return foo.sayFoo(); //ALPHA
}
private:
IFoo& foo; //BETA
};

通常一切都应该工作,例如,像这样:

IFoo& foo = Foo1{};
DummyWrapper wrapper{foo};

wrapper.sayFoo();

我的问题是 foo 实际上只是一个 r 值,在其作用域结束后被删除,如下所示:

DummyWrapper generateWrapper() {
return DummyWrapper{Foo1{}};
}

这会导致“ALPHA”行出现读取问题。一种解决方案是将 r 值放在堆上并使用指针访问 foo。由于我是 C++ 的新手,也许我遇到了 XY 问题,所以我的问题是:

  • 这是唯一的解决方案吗?有没有更好的方法来解决这个问题?
  • 我认为我不能用 IFoo foo 替换“BETA”行,因为这样 DummyWrapper 将始终存储 IFoo< 的字节,而不是 IFoo 实现。或者也许我可以使用值 IFoo foo 来调用派生的虚拟方法?

谢谢你的回复

最佳答案

is this the only solution? Isn't there a better method to use to solve the issue?

不幸的是,一旦涉及多态性,是的,不,没有。但是你得到了一个几乎等同于存储 IFoo foo 的解决方案。 ,如果你使用智能指针:

// member:
std::unique_ptr<IFoo> foo;

// constructor:
DummyWrapper(std::unique_ptr<IFoo>&& foo): foo(std::move(foo)) { }
// need to accept r-value ^
// reference: std::unique_ptr is only movable, not copiable!
// for the same reason, you need to preserve the r-value reference
// on assignment to member...

// creation of the wrapper:
return DummyWrapper(std::make_unique<Foo1>(/* arguments for constructor, if there are */));

I don't think i can replace "BETA" line with IFoo foo since in this way the DummyWrapper will always store the bytes of a IFoo, not of a IFoo implementation. Or maybe I can use the value IFoo foo to call derived virtual methods?

绝对正确:这是一种称为“对象切片”的效果,当您将派生对象分配给基础对象时,来自派生类型的所有多余内容都会丢失。很常见的问题(例如,当人们试图将派生对象存储在 std::vector<Base> 中时)。

关于c++ - 在包装器中保存抽象值对象和继承的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56855441/

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