【问题标题】:Repeated inheritance and static_cast重复继承和static_cast
【发布时间】:2017-10-17 18:27:23
【问题描述】:

我有一个具有以下继承结构的类型橡皮擦:

                     Holder
    /                   |            \
    |                   |            |
Holder_A_1         Holder_B_1    Holder_C_1
    |                   |            ...
Holder_A_2         Holder_B_2
   ...                 ...
    |                   |
Holder_A_base     Holder_B_base  Holder_C_base
    |                   |            ...
Holder_A_base_2   Holder_B_base_2
   ...                 ...
    |                   |             |
Anchor                Anchor        Anchor

(Anchor 基类是故意重复的。)

在对象构造时,我构造了一个 Holder 对象并将其转换为 Anchor* 以进行存储和删除。演员表是通过Holder_A_base* 进行消歧:static_cast<Holder_A_base*>(static_cast<Anchor*>(this))

我的问题是:如果我知道 Holder 被擦除的对象来自这两种类型,那么 static_cast 从 Anchor*(如上所述构造)到 Holder_B_base* 是否合法?

【问题讨论】:

    标签: c++ casting multiple-inheritance type-erasure


    【解决方案1】:

    如果您将问题改写为“static_cast 从Holder_A_base_2 * 到Holder_B_base * 合法吗?”不,它不是,它不会编译。

    从Anchor * 转换为Holder_B_base * 将编译但将是未定义行为,除非指向的Anchor 对象是Holder_B_base 的一部分。

    如果您需要从任何Anchor * 转换为不属于它的类,您可以使用dynamic_cast。这允许交叉转换。

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 1970-01-01
      • 2021-06-14
      • 2015-04-28
      • 2013-01-12
      • 1970-01-01
      • 2020-12-28
      • 2013-10-24
      • 1970-01-01
      相关资源
      最近更新 更多