【发布时间】:2022-01-21 09:40:39
【问题描述】:
我想实现一个函数,它返回对Base 的引用,它实际上包含Derived(类型是多态的)。以下(不正确)代码中的一些内容:
struct Base { virtual ~Base() {} };
struct Derived: Base { int x = 5;};
const Base& get() {
Derived d = {};
const Base& b = d;
return b;
}
int main() {
const Base& b = get();
const auto* a = dynamic_cast<const A*>(&b);
}
显然,此代码会导致未定义的行为,因为 main 中的 b 是一个悬空引用。
所以,我认为主要障碍如下:
- 要~将
Derived传递为Base~,我们需要创建一个引用。函数不能返回对局部变量的引用,因为它将引用堆栈释放的内存。
这个问题有什么解决方法吗(比如用指针代替引用什么的)?
【问题讨论】:
-
不清楚(对我来说)你需要做什么。如果你需要创建一个实例,我会检查工厂函数是如何实现的。如果你只是想要一个对现有实例的基引用,你可以在基类中定义一个
const Base& get() const noexcept { return *this; },尽管这并不是必需的,因为你知道你可以只写const Base& b = d; -
@MatG 我想从函数返回
Derived,就好像它是Base。我知道的唯一方法是使用引用和指针,当我们离开函数的范围时,它们会失效。我想知道这是如何实现的 -
所以它是一个工厂函数。我通常在函数返回的
std::unique_ptr<Base>中实例化堆(新)上的派生类,因为您需要分配内存的所有者。 -
@MatG 对不起,我是新手,不知道工厂是什么:(。你能提供一个简短的回答吗??
-
@MatG 好的,谢谢你的提示 :)
标签: c++ inheritance undefined-behavior dangling-pointer