reinterpret_cast,投到兄弟班
reinterpret_cast, casting to brother class
我只是想知道以下C++代码是否保证有效:
struct B1 {
virtual void f() {};
};
struct B2 {
virtual void f2() {};
};
struct D:public B1,public B2 {
};
int main() {
D d;
B1 *b1=&d;
if (dynamic_cast<B2*>(b1)) {
B2* b2 = reinterpret_cast<B2*>(b1); //is this conversion valid?
};
return 1;
};
当然,你会为什么我需要这个?因为我想替换这个:
C::C(B1* b): member(dynamic_cast<B2*>(b)?dynamic_cast<B2*>(b)->m():b) {};
具有更好的结构(通过性能,不检查类型安全性两次):
C::C(B1* b): member(dynamic_cast<B2*>(b)?reinterpret_cast<B2*>(b)->m():b) {};
提前感谢!
软件问题的解决方案通常是添加间接级别,在本例中为函数。假设dynamic_cast应该是 B2*(而不是 B1),编写一个执行正确操作的函数:
B1 *get_b(B1 *b) {
B2 *b2 = dynamic_cast<B2*>(b);
if (b2)
return b2->m();
else
return b;
}
然后在初始值设定项列表中使用该函数:
C::C(B1 *b) : member(get_b(b)) { }
不,这绝对是无效的。您只能安全地使用 reinterpret_cast 将其转换回原始类型;其他任何内容都是实现定义的。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- 铸造兄弟姐妹类是有充分理由的
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 我可以安全地转换为兄弟类来包装受保护的函数吗
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障