所以,我有一个函数应该返回一个未知类型的对象,比如 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/