gen*_*a2x -4 c++ reinterpret-cast
我只是想知道以下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;
};
Run Code Online (Sandbox Code Playgroud)
当然,你为什么需要这个呢?因为我想替换这个:
C::C(B1* b): member(dynamic_cast<B2*>(b)?dynamic_cast<B2*>(b)->m():b) {};
Run Code Online (Sandbox Code Playgroud)
具有更好的结构(通过性能,不检查类型安全两次):
C::C(B1* b): member(dynamic_cast<B2*>(b)?reinterpret_cast<B2*>(b)->m():b) {};
Run Code Online (Sandbox Code Playgroud)
提前致谢!
软件问题的解决方案通常是添加一个间接级别,在这种情况下是一个函数.假设dynamic_cast应该是B2*(而不是B1),写一个做正确事情的函数:
B1 *get_b(B1 *b) {
B2 *b2 = dynamic_cast<B2*>(b);
if (b2)
return b2->m();
else
return b;
}
Run Code Online (Sandbox Code Playgroud)
然后在初始化列表中使用该函数:
C::C(B1 *b) : member(get_b(b)) { }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
759 次 |
| 最近记录: |