当我们编写状态网时会发生什么 其中B是一个从c ++派生出D1的类,它会创建实际的新对象,或者只是像原始类型一样进行简单的类型转换
D1 d1;
(B)d1;
答案 0 :(得分:1)
类型转换不会创建新对象,但是知道这两种类型的编译器可以应用所需的偏移量来将对象解释为类型转换对象。当然编译器或运行时将确保转换是合法的。
在特定情况下,如果要将派生对象强制转换为基类,则将其称为“slicing”,派生的部分将从基础对象中删除。为了直观地理解这一点,假设d1有一个内存区域来容纳所有这些成员,因为它派生自B,它将有一个子区域来保存其基类的版本。将d1转换为基类时,必须确保变量仅引用子区域并忽略其余部分,换句话说,对象边界在基类部分停止。
答案 1 :(得分:0)
转换类型永远不会创建它们的新实例,而是给出已转换实例的“视图”,就好像它是您所投射的类型一样。
static_cast
将在编译时检查类型是否可转换
dynamic_cast
将在运行时检查类型是否可转换
reinterpret_cast
只是在编译或运行时没有任何检查的情况下进行转换。