重复继承和static_cast

Repeated inheritance and static_cast

本文关键字:cast static 继承      更新时间:2023-10-16

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

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_castAnchor*(如上所述构造)到Holder_B_base*合法吗?

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

Anchor *Holder_B_base *的强制转换将进行编译,但将是Undefined Behavior,除非指向的Anchor对象是Holder_B_base的一部分。

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