【发布时间】:2012-08-15 19:02:59
【问题描述】:
我只是想知道以下 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的性能而哀悼,无论如何使用虚拟方法之类的东西,它们或多或少都带来了相同的结果(可以忽略不计)性能开销(通常是比dynamic_casts, aynway 更好的方法)。 -
@ChristianRau -
static_cast在这里不起作用。static_cast可用于在转换时编译器知道的层次结构中向上或向下移动。它不会像这里讨论的那样进行交叉演员。 -
@ChristianRau - “内部”层次结构与“向上或向下”不同。静态施法只能向上或向下移动,而不是侧向移动。所以它可以从基类到派生类,或从派生类到基类,但不能从
B1*到B2*。这需要在运行时确定B1*指向的对象的实际类型是派生类型,该派生类型也派生自B2。
标签: c++ reinterpret-cast