查看: 127|回复: 2

C++面试:C++ 的四种强制转换

[复制链接]

3

主题

9

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2023-4-9 22:19:28 | 显示全部楼层 |阅读模式
10、 C++ 的四种强制转换

C++ 的四种强制转换包括: static_cast, dynamic_cast, const_cast, reinterpret_cast
static_cast<int>:明确指出类型转换,⼀般建议将隐式转换都替换成显示转换,因为没有动态类型检查,上⾏转换(派⽣类->基类)安全,下⾏转换(基类->派⽣类) 不安全,所以主要执⾏⾮多态的转换作
dynamic_cast<type-id *>:专⻔⽤于派⽣类之间的转换, type-id 必须是类指针,类引⽤或void*,对于下⾏转换是安全的,当类型不⼀致时(即我们的父类指针指向的实际内存不是目标对象type-id *),转换过来的是空指针,⽽static_cast,当类型不 ⼀致时,转换过来的是错误意义的指针,可能造成⾮法访问等问题。
只能用于含有虚函数的类转换,用于类向上和向下转换
向上转换:指子类向基类转换。
向下转换:指基类向子类转换。
这两种转换,子类包含父类,当父类转换成子类时可能出现非法内存访问的问题。
dynamic_cast通过判断变量运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。dynamic_cast可以做类之间上下转换,转换的时候会进行类型检查,类型相等成功转换,类型不等转换失败。运用RTTI技术,RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。在c++层面主要体现在dynamic_cast和typeid,vs中虚函数表的-1位置存放了指向type_info的指针,对于存在虚函数的类型,dynamic_cast和typeid都会去查询type_info。
dynamic_cast使用的场景:
如果你必须做一个非多态的工作在继承类B和C上,但只能接收基类A,则需要如下的操作:
class A { public: virtual ~A(){} };
class B: public A
{
public: void work4B(){}
};
class C: public A
{
public: void work4C(){}
};
void non_polymorphic_work(A* ap)
{
  //因为不知道传入来的是那个对象,但是又想统一的调用一个函数,但我们又不能用多态来实现这个效果
  if (B* bp =dynamic_cast<B*>(ap))
    bp->work4B();
  if (C* cp =dynamic_cast<C*>(ap))
    cp->work4C();
}
const_cast:专⻔⽤于 const 属性的转换,去除 const 性质,或增加 const 性质, 是四个转换符中唯⼀⼀个可以操作常量的转换符。如果一个变量实际上是const,但是被转化成非const,使用的时候一样会报错。
reinterpret_cast:不到万不得已,不要使⽤这个转换符,⾼危操作。使⽤特点: 从底层对数据进⾏重新解释,依赖具体的平台,可移植性差; 可以将整形转 换为指针,也可以把指针转换为数组;可以在指针和引⽤之间进⾏肆⽆忌惮的转换。
回复

使用道具 举报

2

主题

10

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-4-9 22:20:19 | 显示全部楼层
再加一问:C式的括号转换相当于这四种的哪一种?[大笑]
回复

使用道具 举报

4

主题

14

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2025-3-8 06:05:57 | 显示全部楼层
我了个去,顶了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表