首页 > 解决方案 > 如何转换从 C++ 中的函数返回的对象

问题描述

create()在派生类的虚方法中Derived,我返回一个结构类型HelpDerived。但是,由于我必须将方法的返回类型设置为HelpBase,我发现我需要将返回的对象强制转换回类型HelpDerived

以下是我的案例的一个例子。


#include <iostream>


struct HelpBase {
    int a = 0;
    virtual void output() {}
};

struct HelpDerived : HelpBase {
    int b = 0;
    void output() override {}
};


class Base {
public:
    virtual HelpBase create() = 0;
};

class Derived : public Base {
public:
    HelpBase create() override;
};

HelpBase Derived::create() {
    HelpDerived d;
    d.a = 1;
    d.b = 2;
    return d;
}


int main() {
    Derived d;
    auto based = d.create();
    HelpDerived derived = dynamic_cast<HelpDerived &>(based);

    std::cout << derived.a << std::endl;
}

当我运行上面的代码时,我得到了错误

terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast
Abort trap: 6

我对 C++ 中的对象和强制转换有什么误解?为什么这种方法不起作用?

我能做些什么来解决这个问题?

标签: c++inheritancecasting

解决方案


我认为您最好返回一个指针以避免在您的create函数中进行对象切片。

#include <iostream>


struct HelpBase {
    int a = 0;
    virtual void output() {}
};

struct HelpDerived : HelpBase {
    int b = 0;
    void output() override {}
};


class Base {
public:
    virtual HelpBase* create() = 0;
};

class Derived : public Base {
public:
    HelpBase* create() override;
};

HelpBase* Derived::create() {
    HelpDerived* d = new HelpDerived;
    d->a = 1;
    d->b = 2;
    return d;
}

int main() {
    Derived d;
    auto based = d.create();
    HelpDerived* derived = dynamic_cast<HelpDerived *>(based);

    std::cout << derived->a << " " << derived->b << std::endl;
    delete derived;
}

推荐阅读