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

C++ 引用/对象的静态/动态强制转换,c++,object,casting,reference,C++,Object,Casting,Reference,不久前,我和一群演员操作工在一起玩,显然当时我并没有真正了解他们。我正在查看我的代码,我看到了: Base(Derived &p_derived) : m_state(static_cast<Base>(p_derived).m_state){} Base(派生&p_派生):m_状态(静态转换(p_派生).m_状态){ 我想我现在对指针和引用的转换有了更好的理解,这多亏了stackoverflow上的一篇文章,但是现在涉及到了对象。当引用被强制转换到对象时,会发生什么?或

不久前,我和一群演员操作工在一起玩,显然当时我并没有真正了解他们。我正在查看我的代码,我看到了:

Base(Derived &p_derived) : m_state(static_cast<Base>(p_derived).m_state){}
Base(派生&p_派生):m_状态(静态转换(p_派生).m_状态){
我想我现在对指针和引用的转换有了更好的理解,这多亏了stackoverflow上的一篇文章,但是现在涉及到了对象。当引用被强制转换到对象时,会发生什么?或者,如果p_派生的是对象本身,而不仅仅是一个引用呢?它是否会创建新对象?如果是,这些对象将如何实例化


我还感到惊讶的是,它竟然可以被编译,因为在Base.h中,这个代码是在那里找到的,派生的只是前向声明的,这意味着它不应该知道它实际上是从Base派生的。我在另一个地方尝试了从派生*到基*的静态转换,但由于转换单元所涉及的类型不兼容,因此无法编译。

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

这种情况也不例外:您正在使用
p_派生的
裁判,并通过切片从中构造一个新的
Base

static\u cast(p\u派生)
将强制转换引用本身,如果这是您想要的(即使不是:p)

我还感到惊讶的是,它竟然可以被编译,因为在Base.h中,这个代码是在那里找到的,派生的只是前向声明的,这意味着它不应该知道它实际上是从Base派生的


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

那么您是说“static_cast(d)”,无论d是引用还是对象,在这种情况下基本上与“Base b;b=d;”相同?不,更像这样:@user1130005:这正是我要说的。你想用这些代码实现什么?为什么不
m_state(static_cast(p_-derived.m_state.get())
或类似的方法呢?是的,我应该用不同的方法来解决它。我得到了几个从Base派生的类,它们作为派生类之间共享状态的接口,这就是为什么我需要传入一个对象(可能Base&更好)来获取其状态,该状态是Base私有的。我试图把java代码转换成C++,java允许各种疯狂的依赖。这就是我遇到这些问题的原因。我仍然很好奇,为什么静态演员是被允许的。允许在C++中做“a;b b;a= b;”,即使a和b没有共同点吗?只有当类型在某种程度上兼容时。正如我在回答中所说,我并不真的相信你的代码是编译的。是的,你确实暗示了这一点。很抱歉,我没有直接回答这个问题,但这里是:它实际上是编译的。(它实际上是一个共享的ptr,但codepad似乎不喜欢它)