gpt4 book ai didi

c++ - 是否可以从指针的多态容器返回 'accurate' 对象?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:44 27 4
gpt4 key购买 nike

我发现无论何时我们想要多态性,我们都需要指针或引用,因为将 Derived 实例存储在 Base 变量中会“切掉”任何不是的东西在“基础”中定义。

(我想那是因为 DerivedBase 实例不一定占用相同的内存空间。对吗?)

所以当我们想要一个容器来容纳所有类型的对象时,所有对象都派生自 Base 的子类,我们需要一个指针容器而不是实际对象的容器。

如果我们想要一个函数从这个容器中获取一个对象并“按原样”返回它(没有切片),我们可以这样做:

Base* get_pointer(int index) {
return container[index];
}

但是说我想做以下事情:

Base get_object(int index) {
return *container[index];
}

即:返回一个真实的对象,而不是一个指针。这可能吗?或者,当我需要任何类型的多态性时,我是否应该始终使用指针来管理?

最佳答案

I know that whenever we want polymorphism, we need pointers or references [...] Is that correct?

完全正确。但是,您不限于语言中内置的“普通”指针。智能指针,例如 std::unique_ptr<T>std::shared_ptr<T>提出一个更好的替代方案,让您保留多态行为。

[I want to] return a real object, not a pointer. Is this possible?

你可以这样做,但切片会回来。 Base将按值返回,因此结果将被剥夺派生功能。当您按值传递或返回时,这总是会发生(传递和返回是同一事物的两个方面,因此两种情况下的基 native 制是相同的)。

如果你返回Base&但是,通过引用,您会在调用者中获得相同的语法,并且您的对象不会被切片:

Base& get_object(int index) {
return *container[index];
}

唯一的问题是,当您的代码持有对它的引用时,容器中的项目必须保持原样。

关于c++ - 是否可以从指针的多态容器返回 'accurate' 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26342950/

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