有没有办法在 C++ 中将结构向下转换为它的派生结构?
Is there a way to down cast a struct to its derived one in C++?
这是我的情况:
struct A {
int numberAllChildStructsUse;
}
struct B : A {
std::string strUniqueToB;
}
struct C : A {
std::string strUniqueToC;
}
(在某些源文件中)
B b = thisFunctionReturnsBOrCStructsAsTypeA(int idThatGuaranteesItIsTypeBNotC);
Error: no suitable user-defined conversion from A to B exists
当我在上面尝试时。让这个工作的最好方法是什么?结构 A 代表所有 B、C 共享的共性。 B 和 C 中的成员变量是彼此唯一的。该函数 returns A 类型结构,但我知道它们实际上是 Bs 或 Cs,并且可以根据我提供的参数来判断。
您可以为此使用 dynamic_cast
,但前提是 class 层次结构是 多态的。
要实现后者,写
struct A {
int numberAllChildStructsUse;
virtual ~A() = default;
};
如果您的函数 returns 按值,则可能会发生切片并且您无法获得 B
。
如果您的函数 returns 是引用或指针,您有 2 个选项:
如果你绝对确定动态类型是pointer/reference到B
,你可以使用static_cast
。它的开销为零,但如果您输入错误的类型,则会得到 UB。
如果你不确定动态类型是不是pointer/reference到B
,而你的类型是多态的(有虚函数),那么你可以使用dynamic_cast
。它将报告错误,因此您可以以 some overhead 为代价处理失败案例。根据我的经验,dynamic_cast
通常是设计不佳的标志,因此请注意不要混淆内容。
这是我的情况:
struct A {
int numberAllChildStructsUse;
}
struct B : A {
std::string strUniqueToB;
}
struct C : A {
std::string strUniqueToC;
}
(在某些源文件中)
B b = thisFunctionReturnsBOrCStructsAsTypeA(int idThatGuaranteesItIsTypeBNotC);
Error: no suitable user-defined conversion from A to B exists
当我在上面尝试时。让这个工作的最好方法是什么?结构 A 代表所有 B、C 共享的共性。 B 和 C 中的成员变量是彼此唯一的。该函数 returns A 类型结构,但我知道它们实际上是 Bs 或 Cs,并且可以根据我提供的参数来判断。
您可以为此使用 dynamic_cast
,但前提是 class 层次结构是 多态的。
要实现后者,写
struct A {
int numberAllChildStructsUse;
virtual ~A() = default;
};
如果您的函数 returns 按值,则可能会发生切片并且您无法获得 B
。
如果您的函数 returns 是引用或指针,您有 2 个选项:
如果你绝对确定动态类型是pointer/reference到
B
,你可以使用static_cast
。它的开销为零,但如果您输入错误的类型,则会得到 UB。如果你不确定动态类型是不是pointer/reference到
B
,而你的类型是多态的(有虚函数),那么你可以使用dynamic_cast
。它将报告错误,因此您可以以 some overhead 为代价处理失败案例。根据我的经验,dynamic_cast
通常是设计不佳的标志,因此请注意不要混淆内容。