引用/对象的静态/动态强制转换

static/dynamic cast of references/objects

本文关键字:转换 动态 静态 对象 引用      更新时间:2023-10-16

前一段时间,我和一群选角操作符一起玩,显然当时我并没有真正理解。我现在正在查看我的代码,我看到了这个:

Base(Derived &p_derived) : m_state(static_cast<Base>(p_derived).m_state){}

我想我现在对指针和引用的投射有了更好的理解,这要归功于stackoverflow上的一个非常好的答案,但现在涉及到了对象。当引用被投射到对象时,会发生什么?或者,如果p_derived是对象本身而不仅仅是一个引用呢?它会创建新的对象吗?如果是,这些对象将如何安装?

我也很惊讶,因为在这个代码所在的Base.h中,Derived只是前向声明的,这意味着它不应该知道它实际上是从Base派生的。我在另一个地方尝试了从Derived*到Base*的静态转换,但这将理所当然地不会编译,因为就翻译单元而言,类型是不兼容的。

当你使用引用时,你通常实际上是在使用它所引用的对象。这就是引用语法的神奇透明度,而指针是无法做到的;可以说这就是他们存在的原因。

这种情况也不例外:您将p_derived裁判,并通过切片从中构建一个新的Base

static_cast<Base&>(p_derived)将强制转换引用本身,如果这是您想要的(即使不是:p)。

我也很惊讶,因为在这个代码所在的Base.h中,Derived只是前向声明的,这意味着它不应该知道它实际上是从Base派生的。

是的,这也让我很惊讶。你确定吗?(Demo/Demo-不确定您使用的是哪一个)