有没有办法在 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;
};

参考:https://en.cppreference.com/w/cpp/language/dynamic_cast

如果您的函数 returns 按值,则可能会发生切片并且您无法获得 B

如果您的函数 returns 是引用或指针,您有 2 个选项:

  1. 如果你绝对确定动态类型是pointer/reference到B,你可以使用static_cast。它的开销为零,但如果您输入错误的类型,则会得到 UB。

  2. 如果你不确定动态类型是不是pointer/reference到B,而你的类型是多态的(有虚函数),那么你可以使用dynamic_cast。它将报告错误,因此您可以以 some overhead 为代价处理失败案例。根据我的经验,dynamic_cast 通常是设计不佳的标志,因此请注意不要混淆内容。