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

时间:2016-11-03 08:51:45

标签: c++ polymorphism

所以,我有一个函数应该返回一个未知类型的对象,比如C或B.我已经决定添加一个公共基类A并返回它是一个很好的解决方案。我已将int type字段添加到A中,因此我们可以将C对象与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 ++有更好的东西。 我也试过使用引用,但我不知道如何处理对临时对象的引用。
请帮助。

1 个答案:

答案 0 :(得分:1)

返回指针或引用(假设A是多态基础)是最基本的方法,并且相当常用。在函数返回后,必须确保指向(或引用)的对象继续存在 - 否则调用者尝试使用它会产生未定义的行为。

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

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

没有什么" C ish"关于使用指针 - 尽管一些C ++语言狂热者或语言宗教坚果可能告诉你。这是一种技术,你必须尊重它的极限 - 如果你弄错了,就会遇到麻烦。还有其他需要考虑的选择,例如智能指针,它们各有利弊。