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

标签 c++ polymorphism

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

相关文章:

c++ - 你能在函数中声明一个常量对象吗?

c++ - 如何从txt文件中读取矩阵到模板矩阵?

c++ - gcc 内部符号装饰有什么问题?

c++ - C++中的多态迭代器

c# - 对没有公共(public)接口(interface)的多个类的强类型属性引用 (C#)

java - 为什么不能降低 Java 子类中方法的可见性?

c# - 如何调用base.base.method()?

c++ - 解决正交模块的依赖关系

c++ - 如何在适当的时候让模板函数在插入器上使用 back_inserter

C++ 如何区分异构集合中的特定对象类型?