20231017 基础 C++题目
题目
1. 下面展示的代码应当使用
C++
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. 不允许转换
2. 下面展示的代码应当使用
C++
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. 不允许转换
3. 下面展示的代码应当使用
C++
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
可以,如。 reinterpret_cast
可以用于函数指针的转换,而static_cast
不可以。- 此处
reinterpret_cast
并不会产生实际转换代码。 - 普通指针
void *
和函数指针void (*)(void)
在一些平台上的长度不同,C++ 标准并不保证这两种类型能够以reinterpret_cast
互相转换。
- 此处
- 进行
static_cast
转换的时候会发生重载决议,模板函数会实例化为选择到的函数类型,再隐式转换为函数指针。