struct Base { int x; };
struct Derived : Base { int y; }
int get_xy(Base * param){
auto pd = ????_cast<Derived*>(param);
return pd->x * pd->y;
}
- A. static_cast
- B. dynamic_cast
- C. 以上全部
- D. 不允许转换
void erased_call(void (* pfn)(void), const char * param){
auto typed_pfn = ????_cast<void(*)(const char *)>(pfn);
typed_pfn(param);
}
- A. static_cast
- B. reinterpret_cast
- C. 以上全部
- D. 不允许转换
template<typename T>
void foo(T&& i){
// some implemetion code
}
void speciallized_foo(int param){
auto spfoo = ????_cast<void(*)(const double&)>(foo);
spfoo(param);
}
- A. static_cast
- B. reinterpret_cast
- C. 以上全部
- D. 不允许转换
- A
- B
- A
- 此处
Base
并非多态类型,因此 dynamic_cast
无法进行基类指针到派生类指针的转换,而 static_cast
可以,如。
- 你可以为
Base
添加虚函数成员,使其成为多态类型,此时dynamic_cast
可以用于基类到派生类的转换。
- 注意
static_cast
并不像 dynamic_cast
那样具有 RTTI ,无法转换时不会返回 nullptr
或抛出异常。通过不合法的转换得到的指针去访问成员会产生未定义行为。
reinterpret_cast
可以用于函数指针的转换,而 static_cast
不可以。
- 此处
reinterpret_cast
并不会产生实际转换代码。
- 普通指针
void *
和函数指针 void (*)(void)
在一些平台上的长度不同,C++ 标准并不保证这两种类型能够以 reinterpret_cast
互相转换。
- 进行
static_cast
转换的时候会发生重载决议,模板函数会实例化为选择到的函数类型,再隐式转换为函数指针。