首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以返回同级对象的函数的自动返回类型

可以返回同级对象的函数的自动返回类型
EN

Stack Overflow用户
提问于 2019-05-27 22:34:10
回答 1查看 66关注 0票数 1

我有两个继承自Base类的类

代码语言:javascript
复制
struct Base
{
   virtual ~Base() = default;
};

class Derived_1:public Base
{
  public:
     void getSomeFunc();
};

class Derived_2:public Base
{
  public:
     void getSomeFunc();
};

现在我想写一个函数,它接受基类指针对象,在动态类型转换之后,找到合适的子类并返回它,这样我们就可以调用正确版本的getSomeFunc()

我试着写

代码语言:javascript
复制
auto getChild(Base* ptr)
{
  Derived_1 * p = dynamic_cast<Derived_1*>(ptr)
  if(p)
  {
    return p;
  }
  else
  {
      Derived_2 * q = dynamic_cast<Derived_2*>(ptr)
      if(q)
      {
        return q;
      }
     else
     { 
        // some handling to avoid bugs!!
     }
  }

但是它不会被编译。以任何方式满足我的要求。

编辑1

来自编译器的错误是- incorrect deduction of 'auto'。Compile为gcc

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-27 22:39:27

这几乎肯定不是你想要做的。取而代之的是使用虚拟方法:

代码语言:javascript
复制
class Base {
public:
    virtual void getSomeFunc() = 0;
    // ... etc etc ...
};

然后,你可以这样写:

代码语言:javascript
复制
Base* ptr = get_a_base_instance_ptr_from_somewhere();
ptr->getSomeFunc();

在您的代码中,您试图让auto具有p类型或q类型。但是auto只有一种类型。可以同时接受指向Derived_1的指针和指向Derived_2的指针的类型是...是的,你猜对了:Base*

编辑:如果您无法更改BaseDerived_1Derived_2类,则可以考虑使用std::variant<Derived_1*, Derived_2*>,并使用访问为每种类型调用适当的方法。如果您以前没有使用过变体,请参阅CPP-reference page on std::variant。有关如何编写用于变体的访问器的信息,请参阅此SO问题:

How does std::visit work with std::variant?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56328088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档