c++ - 如何转换从 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++ 中的对象和强制转换有什么误解?为什么这种方法不起作用?
我能做些什么来解决这个问题?
解决方案
我认为您最好返回一个指针以避免在您的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;
}
推荐阅读
- swift - CoreData NSManagedObject != NIL 怎么能不包含任何数据(数据:
)? - cassandra - 如何在 cassandra 中将默认时间更改为活表值
- python - 带有python的android上的TTS
- scipy - 评估分布拟合的优度
- c# - 稍微缩小pdf,添加文本,保存
- python - TypeError 的问题:列表索引必须是整数或切片,而不是 dict
- assembly - MASM 汇编语言 cmp 语句
- python - Django tinymce 显示问题
- matlab - 使用简单的欧拉法求解恒星的 EoS (Mathematica)
- c# - 通过公共 IP 地址连接到 C# 套接字