【问题标题】:Casting with structs c++使用结构 c++ 进行强制转换
【发布时间】:2019-06-05 15:49:10
【问题描述】:

我可以简单地将父结构转换为 c++ 中的子结构吗?

我尝试投射:

Base s;
Child tmp = (Child)s;

并得到这个错误: 来自...的 C 风格转换没有匹配的转换

谁能帮我解决这个错误?

【问题讨论】:

  • 你可以,如果你声明了一个Child::Child(Base const &)构造函数。不过,C 风格的演员表是不必要的,只需 Child tmp(s);
  • 没有。孩子可能有基类中不存在的额外成员。他们的价值观从何而来?
  • "我可以简单地将父结构转换为 c++ 中的子结构吗?" 不可以。s 不是“子”。考虑向good C++ book学习。
  • 我强烈建议查看c++ casting question C 风格的演员表非常危险。
  • 你投错了方向,孩子是基地,但不是相反。可能你也想研究指针吗?

标签: c++ struct


【解决方案1】:

结构是由一系列成员组成的类型,其存储按有序序列分配如果序列不匹配,则转换可能不起作用。

在结构对象中,其元素的地址(以及位域分配单元的地址)按照定义成员的顺序增加。指向结构的指针可以转换为指向其第一个成员的指针(或者,如果该成员是位字段,则指向其分配单元)。同样,指向结构的第一个成员的指针可以转换为指向封闭结构的指针。结构的任何两个成员之间或最后一个成员之后可能有未命名的填充,但在第一个成员之前没有。结构的大小至少与其成员大小的总和一样大。

首先,如果您使用的是 c++。为什么要在 BaseChild 之间执行 c 样式转换?

C++ 提供static_cast 用于非多态转换,dynamic_cast 用于多态转换。

关于这些演员阵容的更多信息: Regular cast vs. static_cast vs. dynamic_cast?

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多