重复继承和static_cast
Repeated inheritance and static_cast
我有一个具有以下继承结构的类型擦除器:
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*
合法吗?
如果您将问题改写为"从Holder_A_base_2 *
到Holder_B_base *
对static_cast
合法吗?"不,它不合法,也不会编译。
从Anchor *
到Holder_B_base *
的强制转换将进行编译,但将是Undefined Behavior,除非指向的Anchor
对象是Holder_B_base
的一部分。
如果需要从任何Anchor *
强制转换为它不属于的类,则可以使用dynamic_cast
。这允许交叉广播。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- C++Cast运算符过载
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- static是如何使用ClassA::m_variable处理所有类对象的
- 在[expr.static.cast]/4中,术语"一个可行函数"指的是什么