gpt4 book ai didi

C++,如何返回基类,然后将其转换为派生类?

转载 作者:行者123 更新时间:2023-11-28 05:26:48 25 4
gpt4 key购买 nike

所以,我有一个函数应该返回一个未知类型的对象,比如 C 或 B。我决定添加一个公共(public)基类 A 并返回它是一个很好的解决方案。我在 A 中添加了 int type 字段,这样我们就可以将 B 对象与 C 对象区分开来。
例如,函数本身如下所示:

A f(int x) {
if (x==0)
return B();
else
return C();
}

作为其用法的示例:

A a=f(0);
B b; C c;
if (a.type==OBJ_TYPE_B)
b=a;
else
c=a;

问题很明显:不允许从基类显式转换为派生类。我看到两个解决方案:指针和引用。指针太 C-ish,我不想使用它们。我相信 C++ 有更好的东西。我也尝试过使用引用,但我不知道如何处理对临时对象的引用。
请帮忙。

最佳答案

返回指针或引用(假设A 是一个多态基类)是最基本的方法,也是最常用的方法。有必要确保指向(或引用)的对象在函数返回后继续存在 - 否则调用者使用它的任何尝试都会产生未定义的行为。

另一个常见的需求是必须管理对象的生命周期。例如,如果函数使用运算符new 创建对象,则在不再需要时必须使用运算符delete 释放该对象,否则会导致内存泄漏。问题是对象的释放必须由调用者以某种方式处理。如果该函数返回一个指针,该指针可以存储在一个智能指针中(例如 C++11 或更高版本中的模板化 std::unique_pointer),该指针将管理其生命周期。或者,可以更改函数以返回智能指针。

如果您使用智能指针,请仔细阅读其文档。一些智能指针对它们的使用方式有特定的限制。通常,他们假设他们管理的对象是如何创建的(因此,如果对象是使用运算符 new 创建的,智能指针的析构函数可以使用运算符 delete 释放对象>).通过与对象的创建方式不一致的方式释放对象会产生未定义的行为。智能指针在它们允许对象之间处理的方式上也有所不同(例如,只能一个智能指针引用给定对象,还是多个?)。

使用指针并没有什么“太 C 风格”——尽管某些 C++ 语言狂热者或语言宗教狂可能会告诉您。这是一种技术,您必须遵守它的限制 - 如果您做错了,就会遇到麻烦。还有其他替代方案需要考虑,例如智能指针,它们各有优缺点。

关于C++,如何返回基类,然后将其转换为派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40397181/

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