重复继承和static_cast

时间:2017-10-17 18:27:24

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

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

                     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))

我的问题是:static_castAnchor*(如上所述构建)到Holder_B_base*是否合法,如果我知道Holder被删除的对象的事实来自这两种类型?

1 个答案:

答案 0 :(得分:1)

如果您将static_cast Holder_A_base_2 * Holder_B_base *Anchor *改为Holder_B_base *,那么您的问题就更容易理解了吗?&#34;不,它不是,它不会编译。

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

如果您需要从任何reshape2::dcast(.~Row, data = dta, fun.aggregate=list)[, -1]投射到不属于它的类,您可以使用data.frame。这允许交叉演员。