gpt4 book ai didi

java - 在 C++ 中实例化派生类型

转载 作者:太空宇宙 更新时间:2023-11-04 13:09:38 25 4
gpt4 key购买 nike

假设我有一个基类,以及从它派生的两个类,一和二。在 Java 中,我可能有以下场景:

Base b;
if(condition)
b = new One();
else
b = new Two();

其中对象类型在运行时确定(上述对象在堆上)。

在 C++ 中,我也希望能够在运行时实例化对象类型——我所知道的是它们都共享相同的 Base 类型——但我想保持它的堆栈分配,就像这样:

Base b;

执行此操作的最佳方法是什么?

最佳答案

What's the best way to do this?

你不能。如果将变量类型声明为 Base,它的堆栈分配将适合保存 Base 的实例,而不是派生类型的实例(可能更大,尽管即使不是,您仍然不能按要求执行;C++ 中变量的运行时类型始终与其声明的类型相同)。充其量,你可以 slice将派生实例转换为 Base 类型的变量。

最好的办法是使用一个指针,可选地包裹在 shared_ptrunique_ptr 中,为您提供类似的语义(即让对象在运行时自动销毁超出范围,假设所有权尚未转移)。

Base* b = (condition) ? (Base *) new One() : new Two();
auto bptr = shared_ptr<Base>(b);

请注意,这实际上与 Java 相同。对象本身是堆分配的,但对它的引用是堆栈分配的。不管语法如何,引用类型的 Java 变量本质上等同于 C++ 中的指针。

关于java - 在 C++ 中实例化派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40530818/

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